Fossil

Hex Artifact Content
Login

Artifact 91b8661db27ee16cc58e54c9023bb122366544ecd512d3c16ffed3ef95e35311:


0000: 2f 2a 20 44 4f 20 4e 4f 54 20 45 44 49 54 21 0a  /* DO NOT EDIT!.
0010: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73 20  ** This file is 
0020: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
0030: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 73  nerated by the s
0040: 63 72 69 70 74 20 69 6e 20 74 68 65 20 63 61 6e  cript in the can
0050: 6f 6e 69 63 61 6c 0a 2a 2a 20 53 51 4c 69 74 65  onical.** SQLite
0060: 20 73 6f 75 72 63 65 20 74 72 65 65 20 61 74 20   source tree at 
0070: 74 6f 6f 6c 2f 6d 6b 73 68 65 6c 6c 63 2e 74 63  tool/mkshellc.tc
0080: 6c 2e 20 20 54 68 61 74 20 73 63 72 69 70 74 20  l.  That script 
0090: 63 6f 6d 62 69 6e 65 73 20 73 6f 75 72 63 65 0a  combines source.
00a0: 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 76 61 72  ** code from var
00b0: 69 6f 75 73 20 63 6f 6e 73 74 69 74 75 65 6e 74  ious constituent
00c0: 20 73 6f 75 72 63 65 20 66 69 6c 65 73 20 6f 66   source files of
00d0: 20 53 51 4c 69 74 65 20 69 6e 74 6f 20 74 68 69   SQLite into thi
00e0: 73 20 73 69 6e 67 6c 65 0a 2a 2a 20 22 73 68 65  s single.** "she
00f0: 6c 6c 2e 63 22 20 66 69 6c 65 20 75 73 65 64 20  ll.c" file used 
0100: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
0110: 20 53 51 4c 69 74 65 20 63 6f 6d 6d 61 6e 64 2d   SQLite command-
0120: 6c 69 6e 65 20 73 68 65 6c 6c 2e 0a 2a 2a 0a 2a  line shell..**.*
0130: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 63 6f  * Most of the co
0140: 64 65 20 66 6f 75 6e 64 20 62 65 6c 6f 77 20 63  de found below c
0150: 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 22 73  omes from the "s
0160: 72 63 2f 73 68 65 6c 6c 2e 63 2e 69 6e 22 20 66  rc/shell.c.in" f
0170: 69 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 63 61  ile in.** the ca
0180: 6e 6f 6e 69 63 61 6c 20 53 51 4c 69 74 65 20 73  nonical SQLite s
0190: 6f 75 72 63 65 20 74 72 65 65 2e 20 20 54 68 61  ource tree.  Tha
01a0: 74 20 6d 61 69 6e 20 66 69 6c 65 20 63 6f 6e 74  t main file cont
01b0: 61 69 6e 73 20 22 49 4e 43 4c 55 44 45 22 0a 2a  ains "INCLUDE".*
01c0: 2a 20 6c 69 6e 65 73 20 74 68 61 74 20 73 70 65  * lines that spe
01d0: 63 69 66 79 20 6f 74 68 65 72 20 66 69 6c 65 73  cify other files
01e0: 20 69 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   in the canonica
01f0: 6c 20 73 6f 75 72 63 65 20 74 72 65 65 20 74 68  l source tree th
0200: 61 74 20 61 72 65 0a 2a 2a 20 69 6e 73 65 72 74  at are.** insert
0210: 65 64 20 74 6f 20 67 65 74 6e 65 72 61 74 65 20  ed to getnerate 
0220: 74 68 69 73 20 63 6f 6d 70 6c 65 74 65 20 70 72  this complete pr
0230: 6f 67 72 61 6d 20 73 6f 75 72 63 65 20 66 69 6c  ogram source fil
0240: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  e..**.** The cod
0250: 65 20 66 72 6f 6d 20 6d 75 6c 74 69 70 6c 65 20  e from multiple 
0260: 66 69 6c 65 73 20 69 73 20 63 6f 6d 62 69 6e 65  files is combine
0270: 64 20 69 6e 74 6f 20 74 68 69 73 20 73 69 6e 67  d into this sing
0280: 6c 65 20 22 73 68 65 6c 6c 2e 63 22 0a 2a 2a 20  le "shell.c".** 
0290: 73 6f 75 72 63 65 20 66 69 6c 65 20 74 6f 20 68  source file to h
02a0: 65 6c 70 20 6d 61 6b 65 20 74 68 65 20 63 6f 6d  elp make the com
02b0: 6d 61 6e 64 2d 6c 69 6e 65 20 70 72 6f 67 72 61  mand-line progra
02c0: 6d 20 65 61 73 69 65 72 20 74 6f 20 63 6f 6d 70  m easier to comp
02d0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6d 6f  ile..**.** To mo
02e0: 64 69 66 79 20 74 68 69 73 20 70 72 6f 67 72 61  dify this progra
02f0: 6d 2c 20 67 65 74 20 61 20 63 6f 70 79 20 6f 66  m, get a copy of
0300: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 53   the canonical S
0310: 51 4c 69 74 65 20 73 6f 75 72 63 65 20 74 72 65  QLite source tre
0320: 65 2c 0a 2a 2a 20 65 64 69 74 20 74 68 65 20 73  e,.** edit the s
0330: 72 63 2f 73 68 65 6c 6c 2e 63 2e 69 6e 22 20 61  rc/shell.c.in" a
0340: 6e 64 2f 6f 72 20 73 6f 6d 65 20 6f 66 20 74 68  nd/or some of th
0350: 65 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  e other files th
0360: 61 74 20 61 72 65 20 69 6e 63 6c 75 64 65 64 0a  at are included.
0370: 2a 2a 20 62 79 20 22 73 72 63 2f 73 68 65 6c 6c  ** by "src/shell
0380: 2e 63 2e 69 6e 22 2c 20 74 68 65 6e 20 72 65 72  .c.in", then rer
0390: 75 6e 20 74 68 65 20 74 6f 6f 6c 2f 6d 6b 73 68  un the tool/mksh
03a0: 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70 74 2e  ellc.tcl script.
03b0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 32 30 30 31 20 53  .*/./*.** 2001 S
03c0: 65 70 74 65 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a  eptember 15.**.*
03d0: 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  * The author dis
03e0: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
03f0: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0400: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0410: 6f 66 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e 6f  of.** a legal no
0420: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0430: 62 6c 65 73 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  blessing:.**.** 
0440: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0450: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
0460: 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 66  .**    May you f
0470: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
0480: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
0490: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
04a0: 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 73  .**    May you s
04b0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
04c0: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
04d0: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 2a 2a  han you give..**
04e0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
04f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
0530: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
0540: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
0550: 6e 74 20 74 68 65 20 22 73 71 6c 69 74 65 22 20  nt the "sqlite" 
0560: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0a 2a 2a 20  command line.** 
0570: 75 74 69 6c 69 74 79 20 66 6f 72 20 61 63 63 65  utility for acce
0580: 73 73 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  ssing SQLite dat
0590: 61 62 61 73 65 73 2e 0a 2a 2f 0a 23 69 66 20 28  abases..*/.#if (
05a0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
05b0: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
05c0: 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  )) && !defined(_
05d0: 43 52 54 5f 53 45 43 55 52 45 5f 4e 4f 5f 57 41  CRT_SECURE_NO_WA
05e0: 52 4e 49 4e 47 53 29 0a 2f 2a 20 54 68 69 73 20  RNINGS)./* This 
05f0: 6e 65 65 64 73 20 74 6f 20 63 6f 6d 65 20 62 65  needs to come be
0600: 66 6f 72 65 20 61 6e 79 20 69 6e 63 6c 75 64 65  fore any include
0610: 73 20 66 6f 72 20 4d 53 56 43 20 63 6f 6d 70 69  s for MSVC compi
0620: 6c 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  ler */.#define _
0630: 43 52 54 5f 53 45 43 55 52 45 5f 4e 4f 5f 57 41  CRT_SECURE_NO_WA
0640: 52 4e 49 4e 47 53 0a 23 65 6e 64 69 66 0a 0a 2f  RNINGS.#endif../
0650: 2a 0a 2a 2a 20 57 61 72 6e 69 6e 67 20 70 72 61  *.** Warning pra
0660: 67 6d 61 73 20 63 6f 70 69 65 64 20 66 72 6f 6d  gmas copied from
0670: 20 6d 73 76 63 2e 68 20 69 6e 20 74 68 65 20 63   msvc.h in the c
0680: 6f 72 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ore..*/.#if defi
0690: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 23 70  ned(_MSC_VER).#p
06a0: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
06b0: 73 61 62 6c 65 20 3a 20 34 30 35 34 29 0a 23 70  sable : 4054).#p
06c0: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
06d0: 73 61 62 6c 65 20 3a 20 34 30 35 35 29 0a 23 70  sable : 4055).#p
06e0: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
06f0: 73 61 62 6c 65 20 3a 20 34 31 30 30 29 0a 23 70  sable : 4100).#p
0700: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0710: 73 61 62 6c 65 20 3a 20 34 31 32 37 29 0a 23 70  sable : 4127).#p
0720: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0730: 73 61 62 6c 65 20 3a 20 34 31 33 30 29 0a 23 70  sable : 4130).#p
0740: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0750: 73 61 62 6c 65 20 3a 20 34 31 35 32 29 0a 23 70  sable : 4152).#p
0760: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0770: 73 61 62 6c 65 20 3a 20 34 31 38 39 29 0a 23 70  sable : 4189).#p
0780: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0790: 73 61 62 6c 65 20 3a 20 34 32 30 36 29 0a 23 70  sable : 4206).#p
07a0: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
07b0: 73 61 62 6c 65 20 3a 20 34 32 31 30 29 0a 23 70  sable : 4210).#p
07c0: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
07d0: 73 61 62 6c 65 20 3a 20 34 32 33 32 29 0a 23 70  sable : 4232).#p
07e0: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
07f0: 73 61 62 6c 65 20 3a 20 34 32 34 34 29 0a 23 70  sable : 4244).#p
0800: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0810: 73 61 62 6c 65 20 3a 20 34 33 30 35 29 0a 23 70  sable : 4305).#p
0820: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0830: 73 61 62 6c 65 20 3a 20 34 33 30 36 29 0a 23 70  sable : 4306).#p
0840: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0850: 73 61 62 6c 65 20 3a 20 34 37 30 32 29 0a 23 70  sable : 4702).#p
0860: 72 61 67 6d 61 20 77 61 72 6e 69 6e 67 28 64 69  ragma warning(di
0870: 73 61 62 6c 65 20 3a 20 34 37 30 36 29 0a 23 65  sable : 4706).#e
0880: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
0890: 5f 4d 53 43 5f 56 45 52 29 20 2a 2f 0a 0a 2f 2a  _MSC_VER) */../*
08a0: 0a 2a 2a 20 4e 6f 20 73 75 70 70 6f 72 74 20 66  .** No support f
08b0: 6f 72 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65  or loadable exte
08c0: 6e 73 69 6f 6e 73 20 69 6e 20 56 78 57 6f 72 6b  nsions in VxWork
08d0: 73 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e  s..*/.#if (defin
08e0: 65 64 28 5f 5f 52 54 50 5f 5f 29 20 7c 7c 20 64  ed(__RTP__) || d
08f0: 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
0900: 45 4c 29 29 20 26 26 20 21 53 51 4c 49 54 45 5f  EL)) && !SQLITE_
0910: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
0920: 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  ION.# define SQL
0930: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
0940: 54 45 4e 53 49 4f 4e 20 31 0a 23 65 6e 64 69 66  TENSION 1.#endif
0950: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6c  ../*.** Enable l
0960: 61 72 67 65 2d 66 69 6c 65 20 73 75 70 70 6f 72  arge-file suppor
0970: 74 20 66 6f 72 20 66 6f 70 65 6e 28 29 20 61 6e  t for fopen() an
0980: 64 20 66 72 69 65 6e 64 73 20 6f 6e 20 75 6e 69  d friends on uni
0990: 78 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  x..*/.#ifndef SQ
09a0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
09b0: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
09c0: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
09d0: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
09e0: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
09f0: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
0a00: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
0a10: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
0a20: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
0a30: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  ndif..#include <
0a40: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
0a50: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0a60: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
0a70: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
0a80: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73  t.h>.#include "s
0a90: 71 6c 69 74 65 33 2e 68 22 0a 74 79 70 65 64 65  qlite3.h".typede
0aa0: 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  f sqlite3_int64 
0ab0: 69 36 34 3b 0a 74 79 70 65 64 65 66 20 73 71 6c  i64;.typedef sql
0ac0: 69 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34 3b  ite3_uint64 u64;
0ad0: 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65  .typedef unsigne
0ae0: 64 20 63 68 61 72 20 75 38 3b 0a 23 69 66 20 53  d char u8;.#if S
0af0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
0b00: 4e 54 49 43 41 54 49 4f 4e 0a 23 20 69 6e 63 6c  NTICATION.# incl
0b10: 75 64 65 20 22 73 71 6c 69 74 65 33 75 73 65 72  ude "sqlite3user
0b20: 61 75 74 68 2e 68 22 0a 23 65 6e 64 69 66 0a 23  auth.h".#endif.#
0b30: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0b40: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61  >.#include <stda
0b50: 72 67 2e 68 3e 0a 0a 23 69 66 20 21 64 65 66 69  rg.h>..#if !defi
0b60: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
0b70: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23  defined(WIN32).#
0b80: 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c   include <signal
0b90: 2e 68 3e 0a 23 20 69 66 20 21 64 65 66 69 6e 65  .h>.# if !define
0ba0: 64 28 5f 5f 52 54 50 5f 5f 29 20 26 26 20 21 64  d(__RTP__) && !d
0bb0: 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
0bc0: 45 4c 29 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  EL).#  include <
0bd0: 70 77 64 2e 68 3e 0a 23 20 65 6e 64 69 66 0a 23  pwd.h>.# endif.#
0be0: 65 6e 64 69 66 0a 23 69 66 20 28 21 64 65 66 69  endif.#if (!defi
0bf0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
0c00: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20  defined(WIN32)) 
0c10: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  || defined(__MIN
0c20: 47 57 33 32 5f 5f 29 0a 23 20 69 6e 63 6c 75 64  GW32__).# includ
0c30: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 20 69  e <unistd.h>.# i
0c40: 6e 63 6c 75 64 65 20 3c 64 69 72 65 6e 74 2e 68  nclude <dirent.h
0c50: 3e 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50 49  >.# define GETPI
0c60: 44 20 67 65 74 70 69 64 0a 23 20 69 66 20 64 65  D getpid.# if de
0c70: 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f  fined(__MINGW32_
0c80: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 44 49 52  _).#  define DIR
0c90: 45 4e 54 20 64 69 72 65 6e 74 0a 23 20 20 69 66  ENT dirent.#  if
0ca0: 6e 64 65 66 20 53 5f 49 53 4c 4e 4b 0a 23 20 20  ndef S_ISLNK.#  
0cb0: 20 64 65 66 69 6e 65 20 53 5f 49 53 4c 4e 4b 28   define S_ISLNK(
0cc0: 6d 6f 64 65 29 20 28 30 29 0a 23 20 20 65 6e 64  mode) (0).#  end
0cd0: 69 66 0a 23 20 65 6e 64 69 66 0a 23 65 6c 73 65  if.# endif.#else
0ce0: 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 44  .# define GETPID
0cf0: 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74   (int)GetCurrent
0d00: 50 72 6f 63 65 73 73 49 64 0a 23 65 6e 64 69 66  ProcessId.#endif
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
0d30: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 0a 23   <sys/stat.h>..#
0d40: 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  if HAVE_READLINE
0d50: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64  .# include <read
0d60: 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e  line/readline.h>
0d70: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64  .# include <read
0d80: 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e 0a  line/history.h>.
0d90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
0da0: 5f 45 44 49 54 4c 49 4e 45 0a 23 20 69 6e 63 6c  _EDITLINE.# incl
0db0: 75 64 65 20 3c 65 64 69 74 6c 69 6e 65 2f 72 65  ude <editline/re
0dc0: 61 64 6c 69 6e 65 2e 68 3e 0a 23 65 6e 64 69 66  adline.h>.#endif
0dd0: 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49 54 4c  ..#if HAVE_EDITL
0de0: 49 4e 45 20 7c 7c 20 48 41 56 45 5f 52 45 41 44  INE || HAVE_READ
0df0: 4c 49 4e 45 0a 0a 23 20 64 65 66 69 6e 65 20 73  LINE..# define s
0e00: 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79  hell_add_history
0e10: 28 58 29 20 61 64 64 5f 68 69 73 74 6f 72 79 28  (X) add_history(
0e20: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0e30: 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  l_read_history(X
0e40: 29 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  ) read_history(X
0e50: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0e60: 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58  _write_history(X
0e70: 29 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  ) write_history(
0e80: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0e90: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0ea0: 28 58 29 20 73 74 69 66 6c 65 5f 68 69 73 74 6f  (X) stifle_histo
0eb0: 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ry(X).# define s
0ec0: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29  hell_readline(X)
0ed0: 20 72 65 61 64 6c 69 6e 65 28 58 29 0a 0a 23 65   readline(X)..#e
0ee0: 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49  lif HAVE_LINENOI
0ef0: 53 45 0a 0a 23 20 69 6e 63 6c 75 64 65 20 22 6c  SE..# include "l
0f00: 69 6e 65 6e 6f 69 73 65 2e 68 22 0a 23 20 64 65  inenoise.h".# de
0f10: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
0f20: 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f  istory(X) lineno
0f30: 69 73 65 48 69 73 74 6f 72 79 41 64 64 28 58 29  iseHistoryAdd(X)
0f40: 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f  .# define shell_
0f50: 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20  read_history(X) 
0f60: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0f70: 4c 6f 61 64 28 58 29 0a 23 20 64 65 66 69 6e 65  Load(X).# define
0f80: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0f90: 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73  tory(X) linenois
0fa0: 65 48 69 73 74 6f 72 79 53 61 76 65 28 58 29 0a  eHistorySave(X).
0fb0: 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73  # define shell_s
0fc0: 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29  tifle_history(X)
0fd0: 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72   linenoiseHistor
0fe0: 79 53 65 74 4d 61 78 4c 65 6e 28 58 29 0a 23 20  ySetMaxLen(X).# 
0ff0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61  define shell_rea
1000: 64 6c 69 6e 65 28 58 29 20 6c 69 6e 65 6e 6f 69  dline(X) linenoi
1010: 73 65 28 58 29 0a 0a 23 65 6c 73 65 0a 0a 23 20  se(X)..#else..# 
1020: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61  define shell_rea
1030: 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64  d_history(X).# d
1040: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69 74  efine shell_writ
1050: 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64  e_history(X).# d
1060: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66  efine shell_stif
1070: 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 0a 23  le_history(X)..#
1080: 20 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 55 53   define SHELL_US
1090: 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 20  E_LOCAL_GETLINE 
10a0: 31 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  1.#endif...#if d
10b0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
10c0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
10d0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68  .# include <io.h
10e0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 66 63 6e  >.# include <fcn
10f0: 74 6c 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 69  tl.h>.# define i
1100: 73 61 74 74 79 28 68 29 20 5f 69 73 61 74 74 79  satty(h) _isatty
1110: 28 68 29 0a 23 20 69 66 6e 64 65 66 20 61 63 63  (h).# ifndef acc
1120: 65 73 73 0a 23 20 20 64 65 66 69 6e 65 20 61 63  ess.#  define ac
1130: 63 65 73 73 28 66 2c 6d 29 20 5f 61 63 63 65 73  cess(f,m) _acces
1140: 73 28 28 66 29 2c 28 6d 29 29 0a 23 20 65 6e 64  s((f),(m)).# end
1150: 69 66 0a 23 20 69 66 6e 64 65 66 20 75 6e 6c 69  if.# ifndef unli
1160: 6e 6b 0a 23 20 20 64 65 66 69 6e 65 20 75 6e 6c  nk.#  define unl
1170: 69 6e 6b 20 5f 75 6e 6c 69 6e 6b 0a 23 20 65 6e  ink _unlink.# en
1180: 64 69 66 0a 23 20 69 66 6e 64 65 66 20 73 74 72  dif.# ifndef str
1190: 64 75 70 0a 23 20 20 64 65 66 69 6e 65 20 73 74  dup.#  define st
11a0: 72 64 75 70 20 5f 73 74 72 64 75 70 0a 23 20 65  rdup _strdup.# e
11b0: 6e 64 69 66 0a 23 20 75 6e 64 65 66 20 70 6f 70  ndif.# undef pop
11c0: 65 6e 0a 23 20 64 65 66 69 6e 65 20 70 6f 70 65  en.# define pope
11d0: 6e 20 5f 70 6f 70 65 6e 0a 23 20 75 6e 64 65 66  n _popen.# undef
11e0: 20 70 63 6c 6f 73 65 0a 23 20 64 65 66 69 6e 65   pclose.# define
11f0: 20 70 63 6c 6f 73 65 20 5f 70 63 6c 6f 73 65 0a   pclose _pclose.
1200: 23 65 6c 73 65 0a 20 2f 2a 20 4d 61 6b 65 20 73  #else. /* Make s
1210: 75 72 65 20 69 73 61 74 74 79 28 29 20 68 61 73  ure isatty() has
1220: 20 61 20 70 72 6f 74 6f 74 79 70 65 2e 20 2a 2f   a prototype. */
1230: 0a 20 65 78 74 65 72 6e 20 69 6e 74 20 69 73 61  . extern int isa
1240: 74 74 79 28 69 6e 74 29 3b 0a 0a 23 20 69 66 20  tty(int);..# if 
1250: 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f  !defined(__RTP__
1260: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
1270: 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 2f 2a 20  RS_KERNEL).  /* 
1280: 70 6f 70 65 6e 20 61 6e 64 20 70 63 6c 6f 73 65  popen and pclose
1290: 20 61 72 65 20 6e 6f 74 20 43 38 39 20 66 75 6e   are not C89 fun
12a0: 63 74 69 6f 6e 73 20 61 6e 64 20 73 6f 20 61 72  ctions and so ar
12b0: 65 0a 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73  e.  ** sometimes
12c0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
12d0: 65 20 3c 73 74 64 69 6f 2e 68 3e 20 68 65 61 64  e <stdio.h> head
12e0: 65 72 20 2a 2f 0a 20 20 20 65 78 74 65 72 6e 20  er */.   extern 
12f0: 46 49 4c 45 20 2a 70 6f 70 65 6e 28 63 6f 6e 73  FILE *popen(cons
1300: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
1310: 61 72 2a 29 3b 0a 20 20 20 65 78 74 65 72 6e 20  ar*);.   extern 
1320: 69 6e 74 20 70 63 6c 6f 73 65 28 46 49 4c 45 2a  int pclose(FILE*
1330: 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66  );.# else.#  def
1340: 69 6e 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ine SQLITE_OMIT_
1350: 50 4f 50 45 4e 20 31 0a 23 20 65 6e 64 69 66 0a  POPEN 1.# endif.
1360: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1370: 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
1380: 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61  /* Windows CE (a
1390: 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32  rm-wince-mingw32
13a0: 63 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74  ce-gcc) does not
13b0: 20 70 72 6f 76 69 64 65 20 69 73 61 74 74 79 28   provide isatty(
13c0: 29 0a 20 2a 20 74 68 75 73 20 77 65 20 61 6c 77  ). * thus we alw
13d0: 61 79 73 20 61 73 73 75 6d 65 20 74 68 61 74 20  ays assume that 
13e0: 77 65 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c  we have a consol
13f0: 65 2e 20 54 68 61 74 20 63 61 6e 20 62 65 0a 20  e. That can be. 
1400: 2a 20 6f 76 65 72 72 69 64 64 65 6e 20 77 69 74  * overridden wit
1410: 68 20 74 68 65 20 2d 62 61 74 63 68 20 63 6f 6d  h the -batch com
1420: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
1430: 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  .. */.#define is
1440: 61 74 74 79 28 78 29 20 31 0a 23 65 6e 64 69 66  atty(x) 1.#endif
1450: 0a 0a 2f 2a 20 63 74 79 70 65 20 6d 61 63 72 6f  ../* ctype macro
1460: 73 20 74 68 61 74 20 77 6f 72 6b 20 77 69 74 68  s that work with
1470: 20 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65   signed characte
1480: 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 73  rs */.#define Is
1490: 53 70 61 63 65 28 58 29 20 20 69 73 73 70 61 63  Space(X)  isspac
14a0: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
14b0: 29 58 29 0a 23 64 65 66 69 6e 65 20 49 73 44 69  )X).#define IsDi
14c0: 67 69 74 28 58 29 20 20 69 73 64 69 67 69 74 28  git(X)  isdigit(
14d0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
14e0: 29 0a 23 64 65 66 69 6e 65 20 54 6f 4c 6f 77 65  ).#define ToLowe
14f0: 72 28 58 29 20 20 28 63 68 61 72 29 74 6f 6c 6f  r(X)  (char)tolo
1500: 77 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68  wer((unsigned ch
1510: 61 72 29 58 29 0a 0a 23 69 66 20 64 65 66 69 6e  ar)X)..#if defin
1520: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
1530: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 69 6e  fined(WIN32).#in
1540: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68  clude <windows.h
1550: 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67 20 63 6f 6e  >../* string con
1560: 76 65 72 73 69 6f 6e 20 72 6f 75 74 69 6e 65 73  version routines
1570: 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 6f 6e 20   only needed on 
1580: 57 69 6e 33 32 20 2a 2f 0a 65 78 74 65 72 6e 20  Win32 */.extern 
1590: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
15a0: 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75  n32_unicode_to_u
15b0: 74 66 38 28 4c 50 43 57 53 54 52 29 3b 0a 65 78  tf8(LPCWSTR);.ex
15c0: 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74  tern char *sqlit
15d0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
15e0: 5f 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63  _utf8_v2(const c
15f0: 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74  har *, int);.ext
1600: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
1610: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1620: 6d 62 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68  mbcs_v2(const ch
1630: 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65  ar *, int);.exte
1640: 72 6e 20 4c 50 57 53 54 52 20 73 71 6c 69 74 65  rn LPWSTR sqlite
1650: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1660: 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  unicode(const ch
1670: 61 72 20 2a 7a 54 65 78 74 29 3b 0a 23 65 6e 64  ar *zText);.#end
1680: 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77  if../* On Window
1690: 73 2c 20 77 65 20 6e 6f 72 6d 61 6c 6c 79 20 72  s, we normally r
16a0: 75 6e 20 77 69 74 68 20 6f 75 74 70 75 74 20 6d  un with output m
16b0: 6f 64 65 20 6f 66 20 54 45 58 54 20 73 6f 20 74  ode of TEXT so t
16c0: 68 61 74 20 5c 6e 20 63 68 61 72 61 63 74 65 72  hat \n character
16d0: 73 0a 2a 2a 20 61 72 65 20 61 75 74 6f 6d 61 74  s.** are automat
16e0: 69 63 61 6c 6c 79 20 74 72 61 6e 73 6c 61 74 65  ically translate
16f0: 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f  d into \r\n.  Ho
1700: 77 65 76 65 72 2c 20 74 68 69 73 20 62 65 68 61  wever, this beha
1710: 76 69 6f 72 20 6e 65 65 64 73 0a 2a 2a 20 74 6f  vior needs.** to
1720: 20 62 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   be disabled in 
1730: 73 6f 6d 65 20 63 61 73 65 73 20 28 65 78 3a 20  some cases (ex: 
1740: 77 68 65 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  when generating 
1750: 43 53 56 20 6f 75 74 70 75 74 20 61 6e 64 20 77  CSV output and w
1760: 68 65 6e 0a 2a 2a 20 72 65 6e 64 65 72 69 6e 67  hen.** rendering
1770: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20   quoted strings 
1780: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 5c 6e 20  that contain \n 
1790: 63 68 61 72 61 63 74 65 72 73 29 2e 20 20 54 68  characters).  Th
17a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
17b0: 6f 75 74 69 6e 65 73 20 74 61 6b 65 20 63 61 72  outines take car
17c0: 65 20 6f 66 20 74 68 61 74 2e 0a 2a 2f 0a 23 69  e of that..*/.#i
17d0: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
17e0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
17f0: 33 32 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  32).static void 
1800: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 46 49  setBinaryMode(FI
1810: 4c 45 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73  LE *file, int is
1820: 4f 75 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69  Output){.  if( i
1830: 73 4f 75 74 70 75 74 20 29 20 66 66 6c 75 73 68  sOutput ) fflush
1840: 28 66 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f  (file);.  _setmo
1850: 64 65 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29  de(_fileno(file)
1860: 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a  , _O_BINARY);.}.
1870: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
1880: 65 78 74 4d 6f 64 65 28 46 49 4c 45 20 2a 66 69  extMode(FILE *fi
1890: 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70 75 74  le, int isOutput
18a0: 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74 70 75  ){.  if( isOutpu
18b0: 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c 65 29  t ) fflush(file)
18c0: 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66 69  ;.  _setmode(_fi
18d0: 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f 54  leno(file), _O_T
18e0: 45 58 54 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  EXT);.}.#else.# 
18f0: 64 65 66 69 6e 65 20 73 65 74 42 69 6e 61 72 79  define setBinary
1900: 4d 6f 64 65 28 58 2c 59 29 0a 23 20 64 65 66 69  Mode(X,Y).# defi
1910: 6e 65 20 73 65 74 54 65 78 74 4d 6f 64 65 28 58  ne setTextMode(X
1920: 2c 59 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20  ,Y).#endif.../* 
1930: 54 72 75 65 20 69 66 20 74 68 65 20 74 69 6d 65  True if the time
1940: 72 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  r is enabled */.
1950: 73 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c  static int enabl
1960: 65 54 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20  eTimer = 0;../* 
1970: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1980: 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69  nt wall-clock ti
1990: 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  me */.static sql
19a0: 69 74 65 33 5f 69 6e 74 36 34 20 74 69 6d 65 4f  ite3_int64 timeO
19b0: 66 44 61 79 28 76 6f 69 64 29 7b 0a 20 20 73 74  fDay(void){.  st
19c0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
19d0: 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a   *clockVfs = 0;.
19e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19f0: 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  t;.  if( clockVf
1a00: 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20  s==0 ) clockVfs 
1a10: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1a20: 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 63 6c 6f  nd(0);.  if( clo
1a30: 63 6b 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  ckVfs->iVersion>
1a40: 3d 32 20 26 26 20 63 6c 6f 63 6b 56 66 73 2d 3e  =2 && clockVfs->
1a50: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
1a60: 34 21 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 63  4!=0 ){.    cloc
1a70: 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  kVfs->xCurrentTi
1a80: 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b 56 66 73  meInt64(clockVfs
1a90: 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , &t);.  }else{.
1aa0: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
1ab0: 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72    clockVfs->xCur
1ac0: 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66  rentTime(clockVf
1ad0: 73 2c 20 26 72 29 3b 0a 20 20 20 20 74 20 3d 20  s, &r);.    t = 
1ae0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1af0: 72 2a 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20  r*86400000.0);. 
1b00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d   }.  return t;.}
1b10: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
1b20: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
1b30: 65 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65  ed(WIN32) && !de
1b40: 66 69 6e 65 64 28 5f 5f 6d 69 6e 75 78 29 0a 23  fined(__minux).#
1b50: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d  include <sys/tim
1b60: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  e.h>.#include <s
1b70: 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a  ys/resource.h>..
1b80: 2f 2a 20 56 78 57 6f 72 6b 73 20 64 6f 65 73 20  /* VxWorks does 
1b90: 6e 6f 74 20 73 75 70 70 6f 72 74 20 67 65 74 72  not support getr
1ba0: 75 73 61 67 65 28 29 20 61 73 20 66 61 72 20 61  usage() as far a
1bb0: 73 20 77 65 20 63 61 6e 20 64 65 74 65 72 6d 69  s we can determi
1bc0: 6e 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ne */.#if define
1bd0: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 7c  d(_WRS_KERNEL) |
1be0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f  | defined(__RTP_
1bf0: 5f 29 0a 73 74 72 75 63 74 20 72 75 73 61 67 65  _).struct rusage
1c00: 20 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65   {.  struct time
1c10: 76 61 6c 20 72 75 5f 75 74 69 6d 65 3b 20 2f 2a  val ru_utime; /*
1c20: 20 75 73 65 72 20 43 50 55 20 74 69 6d 65 20 75   user CPU time u
1c30: 73 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  sed */.  struct 
1c40: 74 69 6d 65 76 61 6c 20 72 75 5f 73 74 69 6d 65  timeval ru_stime
1c50: 3b 20 2f 2a 20 73 79 73 74 65 6d 20 43 50 55 20  ; /* system CPU 
1c60: 74 69 6d 65 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a  time used */.};.
1c70: 23 64 65 66 69 6e 65 20 67 65 74 72 75 73 61 67  #define getrusag
1c80: 65 28 41 2c 42 29 20 6d 65 6d 73 65 74 28 42 2c  e(A,B) memset(B,
1c90: 30 2c 73 69 7a 65 6f 66 28 2a 42 29 29 0a 23 65  0,sizeof(*B)).#e
1ca0: 6e 64 69 66 0a 0a 2f 2a 20 53 61 76 65 64 20 72  ndif../* Saved r
1cb0: 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74  esource informat
1cc0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69  ion for the begi
1cd0: 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72  nning of an oper
1ce0: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1cf0: 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73 42  struct rusage sB
1d00: 65 67 69 6e 3b 20 20 2f 2a 20 43 50 55 20 74 69  egin;  /* CPU ti
1d10: 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 73  me at start */.s
1d20: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
1d30: 74 36 34 20 69 42 65 67 69 6e 3b 20 20 2f 2a 20  t64 iBegin;  /* 
1d40: 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20  Wall-clock time 
1d50: 61 74 20 73 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a  at start */../*.
1d60: 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20  ** Begin timing 
1d70: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a  an operation.*/.
1d80: 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69  static void begi
1d90: 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20  nTimer(void){.  
1da0: 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20  if( enableTimer 
1db0: 29 7b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  ){.    getrusage
1dc0: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1dd0: 42 65 67 69 6e 29 3b 0a 20 20 20 20 69 42 65 67  Begin);.    iBeg
1de0: 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  in = timeOfDay()
1df0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ;.  }.}../* Retu
1e00: 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  rn the differenc
1e10: 65 20 6f 66 20 74 77 6f 20 74 69 6d 65 5f 73 74  e of two time_st
1e20: 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73  ructs in seconds
1e30: 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c   */.static doubl
1e40: 65 20 74 69 6d 65 44 69 66 66 28 73 74 72 75 63  e timeDiff(struc
1e50: 74 20 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72  t timeval *pStar
1e60: 74 2c 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  t, struct timeva
1e70: 6c 20 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75  l *pEnd){.  retu
1e80: 72 6e 20 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65  rn (pEnd->tv_use
1e90: 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75  c - pStart->tv_u
1ea0: 73 65 63 29 2a 30 2e 30 30 30 30 30 31 20 2b 0a  sec)*0.000001 +.
1eb0: 20 20 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65           (double
1ec0: 29 28 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d  )(pEnd->tv_sec -
1ed0: 20 70 53 74 61 72 74 2d 3e 74 76 5f 73 65 63 29   pStart->tv_sec)
1ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
1ef0: 20 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75   the timing resu
1f00: 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lts..*/.static v
1f10: 6f 69 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69  oid endTimer(voi
1f20: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
1f30: 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Timer ){.    sql
1f40: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20  ite3_int64 iEnd 
1f50: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
1f60: 20 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65     struct rusage
1f70: 20 73 45 6e 64 3b 0a 20 20 20 20 67 65 74 72 75   sEnd;.    getru
1f80: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1f90: 2c 20 26 73 45 6e 64 29 3b 0a 20 20 20 20 70 72  , &sEnd);.    pr
1fa0: 69 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20  intf("Run Time: 
1fb0: 72 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25  real %.3f user %
1fc0: 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20  f sys %f\n",.   
1fd0: 20 20 20 20 28 69 45 6e 64 20 2d 20 69 42 65 67      (iEnd - iBeg
1fe0: 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20  in)*0.001,.     
1ff0: 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67    timeDiff(&sBeg
2000: 69 6e 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45  in.ru_utime, &sE
2010: 6e 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20  nd.ru_utime),.  
2020: 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73       timeDiff(&s
2030: 42 65 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20  Begin.ru_stime, 
2040: 26 73 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29  &sEnd.ru_stime))
2050: 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65  ;.  }.}..#define
2060: 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67   BEGIN_TIMER beg
2070: 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  inTimer().#defin
2080: 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54  e END_TIMER endT
2090: 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48  imer().#define H
20a0: 41 53 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69  AS_TIMER 1..#eli
20b0: 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f (defined(_WIN3
20c0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
20d0: 4e 33 32 29 29 0a 0a 2f 2a 20 53 61 76 65 64 20  N32))../* Saved 
20e0: 72 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61  resource informa
20f0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67  tion for the beg
2100: 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65  inning of an ope
2110: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
2120: 20 48 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73   HANDLE hProcess
2130: 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d  ;.static FILETIM
2140: 45 20 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 3b  E ftKernelBegin;
2150: 0a 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45  .static FILETIME
2160: 20 66 74 55 73 65 72 42 65 67 69 6e 3b 0a 73 74   ftUserBegin;.st
2170: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
2180: 36 34 20 66 74 57 61 6c 6c 42 65 67 69 6e 3b 0a  64 ftWallBegin;.
2190: 74 79 70 65 64 65 66 20 42 4f 4f 4c 20 28 57 49  typedef BOOL (WI
21a0: 4e 41 50 49 20 2a 47 45 54 50 52 4f 43 54 49 4d  NAPI *GETPROCTIM
21b0: 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c 50 46 49  ES)(HANDLE, LPFI
21c0: 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49  LETIME, LPFILETI
21d0: 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ME,.            
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
2200: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b  ME, LPFILETIME);
2210: 0a 73 74 61 74 69 63 20 47 45 54 50 52 4f 43 54  .static GETPROCT
2220: 49 4d 45 53 20 67 65 74 50 72 6f 63 65 73 73 54  IMES getProcessT
2230: 69 6d 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b  imesAddr = NULL;
2240: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
2250: 20 73 65 65 20 69 66 20 77 65 20 68 61 76 65 20   see if we have 
2260: 74 69 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20  timer support.  
2270: 52 65 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65  Return 1 if nece
2280: 73 73 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74  ssary.** support
2290: 20 66 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64   found (or found
22a0: 20 70 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f   previously)..*/
22b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 54  .static int hasT
22c0: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
22d0: 28 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65  ( getProcessTime
22e0: 73 41 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74  sAddr ){.    ret
22f0: 75 72 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 1;.  } else 
2300: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63  {.    /* GetProc
2310: 65 73 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74  essTimes() isn't
2320: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49   supported in WI
2330: 4e 39 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68  N95 and some oth
2340: 65 72 20 57 69 6e 64 6f 77 73 0a 20 20 20 20 2a  er Windows.    *
2350: 2a 20 76 65 72 73 69 6f 6e 73 2e 20 53 65 65 20  * versions. See 
2360: 69 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77  if the version w
2370: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
2380: 20 68 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20   has it, and if 
2390: 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20  it.    ** does, 
23a0: 73 61 76 65 20 6f 66 66 20 61 20 70 6f 69 6e 74  save off a point
23b0: 65 72 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65  er to it and the
23c0: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
23d0: 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a   handle..    */.
23e0: 20 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47      hProcess = G
23f0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
2400: 28 29 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f  ();.    if( hPro
2410: 63 65 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49  cess ){.      HI
2420: 4e 53 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62  NSTANCE hinstLib
2430: 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54   = LoadLibrary(T
2440: 45 58 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c  EXT("Kernel32.dl
2450: 6c 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l"));.      if( 
2460: 4e 55 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62  NULL != hinstLib
2470: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50   ){.        getP
2480: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
2490: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 47  =.            (G
24a0: 45 54 50 52 4f 43 54 49 4d 45 53 29 20 47 65 74  ETPROCTIMES) Get
24b0: 50 72 6f 63 41 64 64 72 65 73 73 28 68 69 6e 73  ProcAddress(hins
24c0: 74 4c 69 62 2c 20 22 47 65 74 50 72 6f 63 65 73  tLib, "GetProces
24d0: 73 54 69 6d 65 73 22 29 3b 0a 20 20 20 20 20 20  sTimes");.      
24e0: 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 67 65    if( NULL != ge
24f0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
2500: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  r ){.          r
2510: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
2520: 20 7d 0a 20 20 20 20 20 20 20 20 46 72 65 65 4c   }.        FreeL
2530: 69 62 72 61 72 79 28 68 69 6e 73 74 4c 69 62 29  ibrary(hinstLib)
2540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2550: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2560: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74  }../*.** Begin t
2570: 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  iming an operati
2580: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
2590: 64 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69  d beginTimer(voi
25a0: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
25b0: 54 69 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63  Timer && getProc
25c0: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
25d0: 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43      FILETIME ftC
25e0: 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 3b  reation, ftExit;
25f0: 0a 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54  .    getProcessT
2600: 69 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73  imesAddr(hProces
2610: 73 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66  s,&ftCreation,&f
2620: 74 45 78 69 74 2c 0a 20 20 20 20 20 20 20 20 20  tExit,.         
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
2640: 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 26 66  ftKernelBegin,&f
2650: 74 55 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 20  tUserBegin);.   
2660: 20 66 74 57 61 6c 6c 42 65 67 69 6e 20 3d 20 74   ftWallBegin = t
2670: 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d 0a  imeOfDay();.  }.
2680: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
2690: 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74   difference of t
26a0: 77 6f 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  wo FILETIME stru
26b0: 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a  cts in seconds *
26c0: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
26d0: 74 69 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d  timeDiff(FILETIM
26e0: 45 20 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54  E *pStart, FILET
26f0: 49 4d 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71  IME *pEnd){.  sq
2700: 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74  lite_int64 i64St
2710: 61 72 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  art = *((sqlite_
2720: 69 6e 74 36 34 20 2a 29 20 70 53 74 61 72 74 29  int64 *) pStart)
2730: 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ;.  sqlite_int64
2740: 20 69 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c   i64End = *((sql
2750: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e  ite_int64 *) pEn
2760: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f  d);.  return (do
2770: 75 62 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d  uble) ((i64End -
2780: 20 69 36 34 53 74 61 72 74 29 20 2f 20 31 30 30   i64Start) / 100
2790: 30 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a  00000.0);.}../*.
27a0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d  ** Print the tim
27b0: 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  ing results..*/.
27c0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54  static void endT
27d0: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
27e0: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26  ( enableTimer &&
27f0: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2800: 41 64 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54  Addr){.    FILET
2810: 49 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20  IME ftCreation, 
2820: 66 74 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c  ftExit, ftKernel
2830: 45 6e 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a  End, ftUserEnd;.
2840: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2850: 34 20 66 74 57 61 6c 6c 45 6e 64 20 3d 20 74 69  4 ftWallEnd = ti
2860: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 67  meOfDay();.    g
2870: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
2880: 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66 74 43  dr(hProcess,&ftC
2890: 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69 74 2c  reation,&ftExit,
28a0: 26 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 26 66 74  &ftKernelEnd,&ft
28b0: 55 73 65 72 45 6e 64 29 3b 0a 20 20 20 20 70 72  UserEnd);.    pr
28c0: 69 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20  intf("Run Time: 
28d0: 72 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25  real %.3f user %
28e0: 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20  f sys %f\n",.   
28f0: 20 20 20 20 28 66 74 57 61 6c 6c 45 6e 64 20 2d      (ftWallEnd -
2900: 20 66 74 57 61 6c 6c 42 65 67 69 6e 29 2a 30 2e   ftWallBegin)*0.
2910: 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d 65  001,.       time
2920: 44 69 66 66 28 26 66 74 55 73 65 72 42 65 67 69  Diff(&ftUserBegi
2930: 6e 2c 20 26 66 74 55 73 65 72 45 6e 64 29 2c 0a  n, &ftUserEnd),.
2940: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
2950: 26 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20  &ftKernelBegin, 
2960: 26 66 74 4b 65 72 6e 65 6c 45 6e 64 29 29 3b 0a  &ftKernelEnd));.
2970: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42    }.}..#define B
2980: 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e  EGIN_TIMER begin
2990: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
29a0: 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d  END_TIMER endTim
29b0: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53  er().#define HAS
29c0: 5f 54 49 4d 45 52 20 68 61 73 54 69 6d 65 72 28  _TIMER hasTimer(
29d0: 29 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  )..#else.#define
29e0: 20 42 45 47 49 4e 5f 54 49 4d 45 52 0a 23 64 65   BEGIN_TIMER.#de
29f0: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23  fine END_TIMER.#
2a00: 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52  define HAS_TIMER
2a10: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
2a20: 20 55 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74   Used to prevent
2a30: 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
2a40: 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
2a50: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55  s.*/.#define UNU
2a60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29  SED_PARAMETER(x)
2a70: 20 28 76 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a   (void)(x)../*.*
2a80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
2a90: 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61 79  ents in an array
2aa0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72 61  .*/.#define Arra
2ab0: 79 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29 28  ySize(X)  (int)(
2ac0: 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66  sizeof(X)/sizeof
2ad0: 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 49  (X[0]))../*.** I
2ae0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2af0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
2b00: 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75 74  n command execut
2b10: 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20 61 74 20  ion stops.** at 
2b20: 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65 20 61  an error if we a
2b30: 72 65 20 6e 6f 74 20 69 6e 74 65 72 61 63 74 69  re not interacti
2b40: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
2b50: 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72 20  t bail_on_error 
2b60: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 72 65  = 0;../*.** Thre
2b70: 61 74 20 73 74 64 69 6e 20 61 73 20 61 6e 20 69  at stdin as an i
2b80: 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75 74  nteractive input
2b90: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
2ba0: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  g variable.** is
2bb0: 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77 69 73   true.  Otherwis
2bc0: 65 2c 20 61 73 73 75 6d 65 20 73 74 64 69 6e 20  e, assume stdin 
2bd0: 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
2be0: 61 20 66 69 6c 65 20 6f 72 20 70 69 70 65 2e 0a  a file or pipe..
2bf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
2c00: 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74 69  din_is_interacti
2c10: 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  ve = 1;../*.** O
2c20: 6e 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  n Windows system
2c30: 73 20 77 65 20 68 61 76 65 20 74 6f 20 6b 6e 6f  s we have to kno
2c40: 77 20 69 66 20 73 74 61 6e 64 61 72 64 20 6f 75  w if standard ou
2c50: 74 70 75 74 20 69 73 20 61 20 63 6f 6e 73 6f 6c  tput is a consol
2c60: 65 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  e.** in order to
2c70: 20 74 72 61 6e 73 6c 61 74 65 20 55 54 46 2d 38   translate UTF-8
2c80: 20 69 6e 74 6f 20 4d 42 43 53 2e 20 20 54 68 65   into MBCS.  The
2c90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
2ca0: 62 6c 65 20 69 73 0a 2a 2a 20 74 72 75 65 20 69  ble is.** true i
2cb0: 66 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73  f translation is
2cc0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
2cd0: 61 74 69 63 20 69 6e 74 20 73 74 64 6f 75 74 5f  atic int stdout_
2ce0: 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d 20 31 3b 0a  is_console = 1;.
2cf0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2d00: 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70 65 6e  wing is the open
2d10: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
2d20: 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70 6f 69  .  We make a poi
2d30: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20  nter.** to this 
2d40: 64 61 74 61 62 61 73 65 20 61 20 73 74 61 74 69  database a stati
2d50: 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68  c variable so th
2d60: 61 74 20 69 74 20 63 61 6e 20 62 65 20 61 63 63  at it can be acc
2d70: 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  essed.** by the 
2d80: 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72 20 74  SIGINT handler t
2d90: 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61 74 61  o interrupt data
2da0: 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  base processing.
2db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
2dc0: 65 33 20 2a 67 6c 6f 62 61 6c 44 62 20 3d 20 30  e3 *globalDb = 0
2dd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69 66  ;../*.** True if
2de0: 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 28 43   an interrupt (C
2df0: 6f 6e 74 72 6f 6c 2d 43 29 20 68 61 73 20 62 65  ontrol-C) has be
2e00: 65 6e 20 72 65 63 65 69 76 65 64 2e 0a 2a 2f 0a  en received..*/.
2e10: 73 74 61 74 69 63 20 76 6f 6c 61 74 69 6c 65 20  static volatile 
2e20: 69 6e 74 20 73 65 65 6e 49 6e 74 65 72 72 75 70  int seenInterrup
2e30: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  t = 0;../*.** Th
2e40: 69 73 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  is is the name o
2e50: 66 20 6f 75 72 20 70 72 6f 67 72 61 6d 2e 20 49  f our program. I
2e60: 74 20 69 73 20 73 65 74 20 69 6e 20 6d 61 69 6e  t is set in main
2e70: 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61  (), used.** in a
2e80: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68 65 72   number of other
2e90: 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74 6c 79 20   places, mostly 
2ea0: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
2eb0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  es..*/.static ch
2ec0: 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a 2a  ar *Argv0;../*.*
2ed0: 2a 20 50 72 6f 6d 70 74 20 73 74 72 69 6e 67 73  * Prompt strings
2ee0: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 69 6e  . Initialized in
2ef0: 20 6d 61 69 6e 2e 20 53 65 74 74 61 62 6c 65 20   main. Settable 
2f00: 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d 70  with.**   .promp
2f10: 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e 75 65 0a  t main continue.
2f20: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 6d  */.static char m
2f30: 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 20  ainPrompt[20];  
2f40: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 6e 65     /* First line
2f50: 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74   prompt. default
2f60: 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a 2f 0a 73  : "sqlite> "*/.s
2f70: 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 74 69  tatic char conti
2f80: 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d 3b 20 2f  nuePrompt[20]; /
2f90: 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70  * Continuation p
2fa0: 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a 20  rompt. default: 
2fb0: 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a 2f  "   ...> " */../
2fc0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74 70  *.** Render outp
2fd0: 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66 28  ut like fprintf(
2fe0: 29 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  ).  Except, if t
2ff0: 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f 69  he output is goi
3000: 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ng to the.** con
3010: 73 6f 6c 65 20 61 6e 64 20 69 66 20 74 68 69 73  sole and if this
3020: 20 69 73 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 61   is running on a
3030: 20 57 69 6e 64 6f 77 73 20 6d 61 63 68 69 6e 65   Windows machine
3040: 2c 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65 0a  , translate the.
3050: 2a 2a 20 6f 75 74 70 75 74 20 66 72 6f 6d 20 55  ** output from U
3060: 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 0a  TF-8 into MBCS..
3070: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
3080: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
3090: 64 28 57 49 4e 33 32 29 0a 76 6f 69 64 20 75 74  d(WIN32).void ut
30a0: 66 38 5f 70 72 69 6e 74 66 28 46 49 4c 45 20 2a  f8_printf(FILE *
30b0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
30c0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
30d0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
30e0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
30f0: 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 73 74 64  rmat);.  if( std
3100: 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 26  out_is_console &
3110: 26 20 28 6f 75 74 3d 3d 73 74 64 6f 75 74 20 7c  & (out==stdout |
3120: 7c 20 6f 75 74 3d 3d 73 74 64 65 72 72 29 20 29  | out==stderr) )
3130: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 31 20 3d  {.    char *z1 =
3140: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
3150: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
3160: 20 20 20 20 63 68 61 72 20 2a 7a 32 20 3d 20 73      char *z2 = s
3170: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
3180: 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 7a 31 2c  8_to_mbcs_v2(z1,
3190: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
31a0: 5f 66 72 65 65 28 7a 31 29 3b 0a 20 20 20 20 66  _free(z1);.    f
31b0: 70 75 74 73 28 7a 32 2c 20 6f 75 74 29 3b 0a 20  puts(z2, out);. 
31c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
31d0: 7a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  z2);.  }else{.  
31e0: 20 20 76 66 70 72 69 6e 74 66 28 6f 75 74 2c 20    vfprintf(out, 
31f0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
3200: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
3210: 7d 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64  }.#elif !defined
3220: 28 75 74 66 38 5f 70 72 69 6e 74 66 29 0a 23 20  (utf8_printf).# 
3230: 64 65 66 69 6e 65 20 75 74 66 38 5f 70 72 69 6e  define utf8_prin
3240: 74 66 20 66 70 72 69 6e 74 66 0a 23 65 6e 64 69  tf fprintf.#endi
3250: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20  f../*.** Render 
3260: 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69  output like fpri
3270: 6e 74 66 28 29 2e 20 20 54 68 69 73 20 73 68 6f  ntf().  This sho
3280: 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64 20  uld not be used 
3290: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
32a0: 0a 2a 2a 20 69 6e 63 6c 75 64 65 73 20 73 74 72  .** includes str
32b0: 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67 20 28  ing formatting (
32c0: 65 2e 67 2e 20 22 25 73 22 29 2e 0a 2a 2f 0a 23  e.g. "%s")..*/.#
32d0: 69 66 20 21 64 65 66 69 6e 65 64 28 72 61 77 5f  if !defined(raw_
32e0: 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e 65  printf).# define
32f0: 20 72 61 77 5f 70 72 69 6e 74 66 20 66 70 72 69   raw_printf fpri
3300: 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ntf.#endif../* I
3310: 6e 64 69 63 61 74 65 20 6f 75 74 2d 6f 66 2d 6d  ndicate out-of-m
3320: 65 6d 6f 72 79 20 61 6e 64 20 65 78 69 74 2e 20  emory and exit. 
3330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3340: 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f  hell_out_of_memo
3350: 72 79 28 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f  ry(void){.  raw_
3360: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
3370: 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
3380: 6f 72 79 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28  ory\n");.  exit(
3390: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
33a0: 74 65 20 49 2f 4f 20 74 72 61 63 65 73 20 74 6f  te I/O traces to
33b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
33c0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  tream..*/.#ifdef
33d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
33e0: 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 46 49  OTRACE.static FI
33f0: 4c 45 20 2a 69 6f 74 72 61 63 65 20 3d 20 30 3b  LE *iotrace = 0;
3400: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3410: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
3420: 73 20 6c 69 6b 65 20 70 72 69 6e 74 66 20 69 6e  s like printf in
3430: 20 74 68 61 74 20 69 74 73 20 66 69 72 73 74 20   that its first 
3440: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a  argument is a.**
3450: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61   format string a
3460: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  nd subsequent ar
3470: 67 75 6d 65 6e 74 73 20 61 72 65 20 76 61 6c 75  guments are valu
3480: 65 73 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  es to be substit
3490: 75 74 65 64 0a 2a 2a 20 69 6e 20 70 6c 61 63 65  uted.** in place
34a0: 20 6f 66 20 25 20 66 69 65 6c 64 73 2e 20 20 54   of % fields.  T
34b0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 66 6f 72  he result of for
34c0: 6d 61 74 74 69 6e 67 20 74 68 69 73 20 73 74 72  matting this str
34d0: 69 6e 67 0a 2a 2a 20 69 73 20 77 72 69 74 74 65  ing.** is writte
34e0: 6e 20 74 6f 20 69 6f 74 72 61 63 65 2e 0a 2a 2f  n to iotrace..*/
34f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3500: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74  NABLE_IOTRACE.st
3510: 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
3520: 5f 43 44 45 43 4c 20 69 6f 74 72 61 63 65 50 72  _CDECL iotracePr
3530: 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20  intf(const char 
3540: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
3550: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3560: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 69  char *z;.  if( i
3570: 6f 74 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  otrace==0 ) retu
3580: 72 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  rn;.  va_start(a
3590: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
35a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
35b0: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
35c0: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
35d0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 69 6f    utf8_printf(io
35e0: 74 72 61 63 65 2c 20 22 25 73 22 2c 20 7a 29 3b  trace, "%s", z);
35f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3600: 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  z);.}.#endif../*
3610: 0a 2a 2a 20 4f 75 74 70 75 74 20 73 74 72 69 6e  .** Output strin
3620: 67 20 7a 55 74 66 20 74 6f 20 73 74 72 65 61 6d  g zUtf to stream
3630: 20 70 4f 75 74 20 61 73 20 77 20 63 68 61 72 61   pOut as w chara
3640: 63 74 65 72 73 2e 20 20 49 66 20 77 20 69 73 20  cters.  If w is 
3650: 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20 74 68 65  negative,.** the
3660: 6e 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 20  n right-justify 
3670: 74 68 65 20 74 65 78 74 2e 20 20 57 20 69 73 20  the text.  W is 
3680: 74 68 65 20 77 69 64 74 68 20 69 6e 20 55 54 46  the width in UTF
3690: 2d 38 20 63 68 61 72 61 63 74 65 72 73 2c 20 6e  -8 characters, n
36a0: 6f 74 0a 2a 2a 20 69 6e 20 62 79 74 65 73 2e 20  ot.** in bytes. 
36b0: 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
36c0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 25 2a 2e 2a  nt from the %*.*
36d0: 73 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  s specification 
36e0: 69 6e 20 70 72 69 6e 74 66 0a 2a 2a 20 73 69 6e  in printf.** sin
36f0: 63 65 20 77 69 74 68 20 25 2a 2e 2a 73 20 74 68  ce with %*.*s th
3700: 65 20 77 69 64 74 68 20 69 73 20 6d 65 61 73 75  e width is measu
3710: 72 65 64 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  red in bytes, no
3720: 74 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  t characters..*/
3730: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 74 66  .static void utf
3740: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 46 49  8_width_print(FI
3750: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 77 2c  LE *pOut, int w,
3760: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
3770: 66 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  f){.  int i;.  i
3780: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 61 77 20 3d  nt n;.  int aw =
3790: 20 77 3c 30 20 3f 20 2d 77 20 3a 20 77 3b 0a 20   w<0 ? -w : w;. 
37a0: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
37b0: 3b 0a 20 20 69 66 28 20 61 77 3e 28 69 6e 74 29  ;.  if( aw>(int)
37c0: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 33 20 29  sizeof(zBuf)/3 )
37d0: 20 61 77 20 3d 20 28 69 6e 74 29 73 69 7a 65 6f   aw = (int)sizeo
37e0: 66 28 7a 42 75 66 29 2f 33 3b 0a 20 20 66 6f 72  f(zBuf)/3;.  for
37f0: 28 69 3d 6e 3d 30 3b 20 7a 55 74 66 5b 69 5d 3b  (i=n=0; zUtf[i];
3800: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28   i++){.    if( (
3810: 7a 55 74 66 5b 69 5d 26 30 78 63 30 29 21 3d 30  zUtf[i]&0xc0)!=0
3820: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 6e 2b 2b  x80 ){.      n++
3830: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 61  ;.      if( n==a
3840: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  w ){.        do{
3850: 20 69 2b 2b 3b 20 7d 77 68 69 6c 65 28 20 28 7a   i++; }while( (z
3860: 55 74 66 5b 69 5d 26 30 78 63 30 29 3d 3d 30 78  Utf[i]&0xc0)==0x
3870: 38 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72  80 );.        br
3880: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3890: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 3d   }.  }.  if( n>=
38a0: 61 77 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  aw ){.    utf8_p
38b0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 2e 2a  rintf(pOut, "%.*
38c0: 73 22 2c 20 69 2c 20 7a 55 74 66 29 3b 0a 20 20  s", i, zUtf);.  
38d0: 7d 65 6c 73 65 20 69 66 28 20 77 3c 30 20 29 7b  }else if( w<0 ){
38e0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
38f0: 28 70 4f 75 74 2c 20 22 25 2a 73 25 73 22 2c 20  (pOut, "%*s%s", 
3900: 61 77 2d 6e 2c 20 22 22 2c 20 7a 55 74 66 29 3b  aw-n, "", zUtf);
3910: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
3920: 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20  f8_printf(pOut, 
3930: 22 25 73 25 2a 73 22 2c 20 7a 55 74 66 2c 20 61  "%s%*s", zUtf, a
3940: 77 2d 6e 2c 20 22 22 29 3b 0a 20 20 7d 0a 7d 0a  w-n, "");.  }.}.
3950: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
3960: 65 73 20 69 66 20 61 20 73 74 72 69 6e 67 20 69  es if a string i
3970: 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f  s a number of no
3980: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3990: 20 69 73 4e 75 6d 62 65 72 28 63 6f 6e 73 74 20   isNumber(const 
39a0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 72 65  char *z, int *re
39b0: 61 6c 6e 75 6d 29 7b 0a 20 20 69 66 28 20 2a 7a  alnum){.  if( *z
39c0: 3d 3d 27 2d 27 20 7c 7c 20 2a 7a 3d 3d 27 2b 27  =='-' || *z=='+'
39d0: 20 29 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 21 49   ) z++;.  if( !I
39e0: 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 0a 20 20  sDigit(*z) ){.  
39f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3a00: 20 20 7a 2b 2b 3b 0a 20 20 69 66 28 20 72 65 61    z++;.  if( rea
3a10: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
3a20: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 49 73  = 0;.  while( Is
3a30: 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  Digit(*z) ){ z++
3a40: 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2e  ; }.  if( *z=='.
3a50: 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  ' ){.    z++;.  
3a60: 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28 2a    if( !IsDigit(*
3a70: 7a 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  z) ) return 0;. 
3a80: 20 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69     while( IsDigi
3a90: 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  t(*z) ){ z++; }.
3aa0: 20 20 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20      if( realnum 
3ab0: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a  ) *realnum = 1;.
3ac0: 20 20 7d 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 65    }.  if( *z=='e
3ad0: 27 20 7c 7c 20 2a 7a 3d 3d 27 45 27 20 29 7b 0a  ' || *z=='E' ){.
3ae0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3af0: 20 2a 7a 3d 3d 27 2b 27 20 7c 7c 20 2a 7a 3d 3d   *z=='+' || *z==
3b00: 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69  '-' ) z++;.    i
3b10: 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20  f( !IsDigit(*z) 
3b20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
3b30: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
3b40: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20  z) ){ z++; }.   
3b50: 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
3b60: 72 65 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d  realnum = 1;.  }
3b70: 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b  .  return *z==0;
3b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
3b90: 65 20 61 20 73 74 72 69 6e 67 20 6c 65 6e 67 74  e a string lengt
3ba0: 68 20 74 68 61 74 20 69 73 20 6c 69 6d 69 74 65  h that is limite
3bb0: 64 20 74 6f 20 77 68 61 74 20 63 61 6e 20 62 65  d to what can be
3bc0: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 6c 6f   stored in.** lo
3bd0: 77 65 72 20 33 30 20 62 69 74 73 20 6f 66 20 61  wer 30 bits of a
3be0: 20 33 32 2d 62 69 74 20 73 69 67 6e 65 64 20 69   32-bit signed i
3bf0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  nteger..*/.stati
3c00: 63 20 69 6e 74 20 73 74 72 6c 65 6e 33 30 28 63  c int strlen30(c
3c10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
3c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20   const char *z2 
3c30: 3d 20 7a 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = z;.  while( *z
3c40: 32 20 29 7b 20 7a 32 2b 2b 3b 20 7d 0a 20 20 72  2 ){ z2++; }.  r
3c50: 65 74 75 72 6e 20 30 78 33 66 66 66 66 66 66 66  eturn 0x3fffffff
3c60: 20 26 20 28 69 6e 74 29 28 7a 32 20 2d 20 7a 29   & (int)(z2 - z)
3c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3c80: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
3c90: 61 20 73 74 72 69 6e 67 20 69 6e 20 63 68 61 72  a string in char
3ca0: 61 63 74 65 72 73 2e 20 20 4d 75 6c 74 69 62 79  acters.  Multiby
3cb0: 74 65 20 55 54 46 38 20 63 68 61 72 61 63 74 65  te UTF8 characte
3cc0: 72 73 0a 2a 2a 20 63 6f 75 6e 74 20 61 73 20 61  rs.** count as a
3cd0: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
3ce0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
3cf0: 20 73 74 72 6c 65 6e 43 68 61 72 28 63 6f 6e 73   strlenChar(cons
3d00: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
3d10: 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t n = 0;.  while
3d20: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  ( *z ){.    if( 
3d30: 28 30 78 63 30 26 2a 28 7a 2b 2b 29 29 21 3d 30  (0xc0&*(z++))!=0
3d40: 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  x80 ) n++;.  }. 
3d50: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
3d60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3d70: 20 72 65 61 64 73 20 61 20 6c 69 6e 65 20 6f 66   reads a line of
3d80: 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c 45 20   text from FILE 
3d90: 69 6e 2c 20 73 74 6f 72 65 73 0a 2a 2a 20 74 68  in, stores.** th
3da0: 65 20 74 65 78 74 20 69 6e 20 6d 65 6d 6f 72 79  e text in memory
3db0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
3dc0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 74 75  alloc() and retu
3dd0: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
3de0: 20 74 6f 20 74 68 65 20 74 65 78 74 2e 20 20 4e   to the text.  N
3df0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
3e00: 61 74 20 65 6e 64 20 6f 66 20 66 69 6c 65 2c 20  at end of file, 
3e10: 6f 72 20 69 66 20 6d 61 6c 6c 6f 63 28 29 0a 2a  or if malloc().*
3e20: 2a 20 66 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  * fails..**.** I
3e30: 66 20 7a 4c 69 6e 65 20 69 73 20 6e 6f 74 20 4e  f zLine is not N
3e40: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 61  ULL then it is a
3e50: 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
3e60: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 2a   returned from.*
3e70: 2a 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c  * a previous cal
3e80: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
3e90: 65 20 74 68 61 74 20 6d 61 79 20 62 65 20 72 65  e that may be re
3ea0: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
3eb0: 63 68 61 72 20 2a 6c 6f 63 61 6c 5f 67 65 74 6c  char *local_getl
3ec0: 69 6e 65 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  ine(char *zLine,
3ed0: 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 69 6e   FILE *in){.  in
3ee0: 74 20 6e 4c 69 6e 65 20 3d 20 7a 4c 69 6e 65 3d  t nLine = zLine=
3ef0: 3d 30 20 3f 20 30 20 3a 20 31 30 30 3b 0a 20 20  =0 ? 0 : 100;.  
3f00: 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 77 68  int n = 0;..  wh
3f10: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
3f20: 28 20 6e 2b 31 30 30 3e 6e 4c 69 6e 65 20 29 7b  ( n+100>nLine ){
3f30: 0a 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6e  .      nLine = n
3f40: 4c 69 6e 65 2a 32 20 2b 20 31 30 30 3b 0a 20 20  Line*2 + 100;.  
3f50: 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c      zLine = real
3f60: 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65  loc(zLine, nLine
3f70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  );.      if( zLi
3f80: 6e 65 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75  ne==0 ) shell_ou
3f90: 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
3fa0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65     }.    if( fge
3fb0: 74 73 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c  ts(&zLine[n], nL
3fc0: 69 6e 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20  ine - n, in)==0 
3fd0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  ){.      if( n==
3fe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65  0 ){.        fre
3ff0: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
4000: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
4010: 20 20 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b    }.      zLine[
4020: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  n] = 0;.      br
4030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  eak;.    }.    w
4040: 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29  hile( zLine[n] )
4050: 20 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e 3e   n++;.    if( n>
4060: 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d  0 && zLine[n-1]=
4070: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e  ='\n' ){.      n
4080: 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  --;.      if( n>
4090: 30 20 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d  0 && zLine[n-1]=
40a0: 3d 27 5c 72 27 20 29 20 6e 2d 2d 3b 0a 20 20 20  ='\r' ) n--;.   
40b0: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
40c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
40d0: 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69    }.  }.#if defi
40e0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
40f0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20  efined(WIN32).  
4100: 2f 2a 20 46 6f 72 20 69 6e 74 65 72 61 63 74 69  /* For interacti
4110: 76 65 20 69 6e 70 75 74 20 6f 6e 20 57 69 6e 64  ve input on Wind
4120: 6f 77 73 20 73 79 73 74 65 6d 73 2c 20 74 72 61  ows systems, tra
4130: 6e 73 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  nslate the.  ** 
4140: 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61  multi-byte chara
4150: 63 74 65 72 73 65 74 20 63 68 61 72 61 63 74 65  cterset characte
4160: 72 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 2a  rs into UTF-8. *
4170: 2f 0a 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73  /.  if( stdin_is
4180: 5f 69 6e 74 65 72 61 63 74 69 76 65 20 26 26 20  _interactive && 
4190: 69 6e 3d 3d 73 74 64 69 6e 20 29 7b 0a 20 20 20  in==stdin ){.   
41a0: 20 63 68 61 72 20 2a 7a 54 72 61 6e 73 20 3d 20   char *zTrans = 
41b0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
41c0: 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 7a 4c  cs_to_utf8_v2(zL
41d0: 69 6e 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ine, 0);.    if(
41e0: 20 7a 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20   zTrans ){.     
41f0: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 73 74   int nTrans = st
4200: 72 6c 65 6e 33 30 28 7a 54 72 61 6e 73 29 2b 31  rlen30(zTrans)+1
4210: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 61  ;.      if( nTra
4220: 6e 73 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  ns>nLine ){.    
4230: 20 20 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c      zLine = real
4240: 6c 6f 63 28 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e  loc(zLine, nTran
4250: 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
4260: 7a 4c 69 6e 65 3d 3d 30 20 29 20 73 68 65 6c 6c  zLine==0 ) shell
4270: 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
4280: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4290: 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c 20 7a 54  memcpy(zLine, zT
42a0: 72 61 6e 73 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  rans, nTrans);. 
42b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
42c0: 65 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20 7d  e(zTrans);.    }
42d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64  .  }.#endif /* d
42e0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
42f0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
4300: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 4c 69   */.  return zLi
4310: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ne;.}../*.** Ret
4320: 72 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20 6c  rieve a single l
4330: 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65 78  ine of input tex
4340: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d 3d  t..**.** If in==
4350: 30 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f 6d  0 then read from
4360: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20   standard input 
4370: 61 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f 72  and prompt befor
4380: 65 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a 20  e each line..** 
4390: 49 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f  If isContinuatio
43a0: 6e 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  n is true, then 
43b0: 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 70  a continuation p
43c0: 72 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70 72  rompt is appropr
43d0: 69 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f  iate..** If isCo
43e0: 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a 65  ntinuation is ze
43f0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61 69  ro, then the mai
4400: 6e 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64 20  n prompt should 
4410: 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  be used..**.** I
4420: 66 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74 20  f zPrior is not 
4430: 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20  NULL then it is 
4440: 61 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61 20  a buffer from a 
4450: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68  prior call to th
4460: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 68  is.** routine th
4470: 61 74 20 63 61 6e 20 62 65 20 72 65 75 73 65 64  at can be reused
4480: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
4490: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
44a0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
44b0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
44c0: 20 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a 20   must either.** 
44d0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
44e0: 63 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20 70  caller or else p
44f0: 61 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  assed back into 
4500: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
4510: 20 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20 61   the.** zPrior a
4520: 72 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75 73  rgument for reus
4530: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
4540: 72 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69 6e  r *one_input_lin
4550: 65 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61 72  e(FILE *in, char
4560: 20 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69 73   *zPrior, int is
4570: 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a 20  Continuation){. 
4580: 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b 0a   char *zPrompt;.
4590: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b    char *zResult;
45a0: 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b 0a  .  if( in!=0 ){.
45b0: 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f      zResult = lo
45c0: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69  cal_getline(zPri
45d0: 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73 65  or, in);.  }else
45e0: 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d 20  {.    zPrompt = 
45f0: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 3f  isContinuation ?
4600: 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 20   continuePrompt 
4610: 3a 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23 69  : mainPrompt;.#i
4620: 66 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41  f SHELL_USE_LOCA
4630: 4c 5f 47 45 54 4c 49 4e 45 0a 20 20 20 20 70 72  L_GETLINE.    pr
4640: 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 72 6f 6d  intf("%s", zProm
4650: 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28  pt);.    fflush(
4660: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a 52 65  stdout);.    zRe
4670: 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74  sult = local_get
4680: 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73 74 64  line(zPrior, std
4690: 69 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 66  in);.#else.    f
46a0: 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 20  ree(zPrior);.   
46b0: 20 7a 52 65 73 75 6c 74 20 3d 20 73 68 65 6c 6c   zResult = shell
46c0: 5f 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d 70  _readline(zPromp
46d0: 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 73  t);.    if( zRes
46e0: 75 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74 20  ult && *zResult 
46f0: 29 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74  ) shell_add_hist
4700: 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23 65  ory(zResult);.#e
4710: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
4720: 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 0a 2f  n zResult;.}.../
4730: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4740: 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64  value of a hexad
4750: 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52  ecimal digit.  R
4760: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
4770: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
4780: 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a  a hex digit..*/.
4790: 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69  static int hexDi
47a0: 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29  gitValue(char c)
47b0: 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26  {.  if( c>='0' &
47c0: 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72  & c<='9' ) retur
47d0: 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28  n c - '0';.  if(
47e0: 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66   c>='a' && c<='f
47f0: 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
4800: 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63  a' + 10;.  if( c
4810: 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
4820: 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27  ) return c - 'A'
4830: 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20   + 10;.  return 
4840: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  -1;.}../*.** Int
4850: 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61  erpret zArg as a
4860: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  n integer value,
4870: 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73   possibly with s
4880: 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74  uffixes..*/.stat
4890: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
48a0: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f   integerValue(co
48b0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
48c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
48d0: 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63   v = 0;.  static
48e0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
48f0: 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69  char *zSuffix; i
4900: 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c  nt iMult; } aMul
4910: 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b  t[] = {.    { "K
4920: 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20  iB", 1024 },.   
4930: 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31   { "MiB", 1024*1
4940: 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69  024 },.    { "Gi
4950: 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30  B", 1024*1024*10
4960: 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22  24 },.    { "KB"
4970: 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b  ,  1000 },.    {
4980: 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20   "MB",  1000000 
4990: 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20  },.    { "GB",  
49a0: 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
49b0: 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20    { "K",   1000 
49c0: 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20  },.    { "M",   
49d0: 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
49e0: 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30   "G",   10000000
49f0: 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  00 },.  };.  int
4a00: 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   i;.  int isNeg 
4a10: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  = 0;.  if( zArg[
4a20: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
4a30: 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41  sNeg = 1;.    zA
4a40: 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rg++;.  }else if
4a50: 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29  ( zArg[0]=='+' )
4a60: 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  {.    zArg++;.  
4a70: 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  }.  if( zArg[0]=
4a80: 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
4a90: 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='x' ){.    int 
4aa0: 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32  x;.    zArg += 2
4ab0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20  ;.    while( (x 
4ac0: 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  = hexDigitValue(
4ad0: 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a  zArg[0]))>=0 ){.
4ae0: 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29        v = (v<<4)
4af0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67   + x;.      zArg
4b00: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
4b10: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  e{.    while( Is
4b20: 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29  Digit(zArg[0]) )
4b30: 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
4b40: 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27   + zArg[0] - '0'
4b50: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
4b60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
4b70: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4b80: 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  (aMult); i++){. 
4b90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
4ba0: 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
4bb0: 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
4bc0: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
4bd0: 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
4be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4bf0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4c00: 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d  isNeg? -v : v;.}
4c10: 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61 72 69 61 62  ../*.** A variab
4c20: 6c 65 20 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  le length string
4c30: 20 74 6f 20 77 68 69 63 68 20 6f 6e 65 20 63 61   to which one ca
4c40: 6e 20 61 70 70 65 6e 64 20 74 65 78 74 2e 0a 2a  n append text..*
4c50: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4c60: 20 53 68 65 6c 6c 54 65 78 74 20 53 68 65 6c 6c   ShellText Shell
4c70: 54 65 78 74 3b 0a 73 74 72 75 63 74 20 53 68 65  Text;.struct She
4c80: 6c 6c 54 65 78 74 20 7b 0a 20 20 63 68 61 72 20  llText {.  char 
4c90: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  *z;.  int n;.  i
4ca0: 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f  nt nAlloc;.};../
4cb0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
4cc0: 61 6e 64 20 64 65 73 74 72 6f 79 20 61 20 53 68  and destroy a Sh
4cd0: 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 0a 2a  ellText object.*
4ce0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4cf0: 69 74 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  itText(ShellText
4d00: 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
4d10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
4d20: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4d30: 66 72 65 65 54 65 78 74 28 53 68 65 6c 6c 54 65  freeText(ShellTe
4d40: 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 70  xt *p){.  free(p
4d50: 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74 54 65 78 74  ->z);.  initText
4d60: 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69  (p);.}../* zIn i
4d70: 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
4d80: 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72  er to a NULL-ter
4d90: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
4da0: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
4db0: 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  d.** from malloc
4dc0: 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f  (), or a NULL po
4dd0: 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69 6e  inter. The strin
4de0: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
4df0: 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64  zAppend is.** ad
4e00: 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20  ded to zIn, and 
4e10: 74 68 65 20 72 65 73 75 6c 74 20 72 65 74 75 72  the result retur
4e20: 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ned in memory ob
4e30: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
4e40: 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66  oc()..** zIn, if
4e50: 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c   it was not NULL
4e60: 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  , is freed..**.*
4e70: 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
4e80: 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20  rgument, quote, 
4e90: 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65  is not '\0', the
4ea0: 6e 20 69 74 20 69 73 20 75 73 65 64 20 61 73 20  n it is used as 
4eb0: 61 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61  a.** quote chara
4ec0: 63 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64  cter for zAppend
4ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4ee0: 20 61 70 70 65 6e 64 54 65 78 74 28 53 68 65 6c   appendText(Shel
4ef0: 6c 54 65 78 74 20 2a 70 2c 20 63 68 61 72 20 63  lText *p, char c
4f00: 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20 63  onst *zAppend, c
4f10: 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69 6e  har quote){.  in
4f20: 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  t len;.  int i;.
4f30: 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20    int nAppend = 
4f40: 73 74 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e 64  strlen30(zAppend
4f50: 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70 70  );..  len = nApp
4f60: 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66  end+p->n+1;.  if
4f70: 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c  ( quote ){.    l
4f80: 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72  en += 2;.    for
4f90: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
4fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4fb0: 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f   zAppend[i]==quo
4fc0: 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20  te ) len++;.    
4fd0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
4fe0: 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63  n+len>=p->nAlloc
4ff0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f   ){.    p->nAllo
5000: 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  c = p->nAlloc*2 
5010: 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a 20 20 20 20  + len + 20;.    
5020: 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 70  p->z = realloc(p
5030: 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  ->z, p->nAlloc);
5040: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30  .    if( p->z==0
5050: 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
5060: 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 7d 0a 0a 20  memory();.  }.. 
5070: 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20   if( quote ){.  
5080: 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 70    char *zCsr = p
5090: 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a  ->z+p->n;.    *z
50a0: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
50b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
50c0: 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ppend; i++){.   
50d0: 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70     *zCsr++ = zAp
50e0: 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pend[i];.      i
50f0: 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71  f( zAppend[i]==q
5100: 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d  uote ) *zCsr++ =
5110: 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20   quote;.    }.  
5120: 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74    *zCsr++ = quot
5130: 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 69  e;.    p->n = (i
5140: 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e 7a 29  nt)(zCsr - p->z)
5150: 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c  ;.    *zCsr = '\
5160: 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0';.  }else{.   
5170: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e   memcpy(p->z+p->
5180: 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70  n, zAppend, nApp
5190: 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b  end);.    p->n +
51a0: 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20 20 70  = nAppend;.    p
51b0: 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27  ->z[p->n] = '\0'
51c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
51d0: 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d  ttempt to determ
51e0: 69 6e 65 20 69 66 20 69 64 65 6e 74 69 66 69 65  ine if identifie
51f0: 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20 74 6f  r zName needs to
5200: 20 62 65 20 71 75 6f 74 65 64 2c 20 65 69 74 68   be quoted, eith
5210: 65 72 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74  er.** because it
5220: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c   contains non-al
5230: 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61  phanumeric chara
5240: 63 74 65 72 73 2c 20 6f 72 20 62 65 63 61 75 73  cters, or becaus
5250: 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20 53 51  e it is an.** SQ
5260: 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e 20 20 42  Lite keyword.  B
5270: 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 69  e conservative i
5280: 6e 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 3a  n this estimate:
5290: 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20    When in doubt 
52a0: 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20 71  assume.** that q
52b0: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
52c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
52d0: 20 27 22 27 20 69 66 20 71 75 6f 74 69 6e 67 20   '"' if quoting 
52e0: 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 52 65  is required.  Re
52f0: 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 71 75 6f  turn 0 if no quo
5300: 74 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64  ting is required
5310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
5320: 20 71 75 6f 74 65 43 68 61 72 28 63 6f 6e 73 74   quoteChar(const
5330: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
5340: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 69   int i;.  if( !i
5350: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
5360: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20   char)zName[0]) 
5370: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27  && zName[0]!='_'
5380: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5390: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
53a0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
53b0: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
53c0: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
53d0: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
53e0: 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22  ='_' ) return '"
53f0: 27 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ';.  }.  return 
5400: 73 71 6c 69 74 65 33 5f 6b 65 79 77 6f 72 64 5f  sqlite3_keyword_
5410: 63 68 65 63 6b 28 7a 4e 61 6d 65 2c 20 69 29 20  check(zName, i) 
5420: 3f 20 27 22 27 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  ? '"' : 0;.}../*
5430: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
5440: 66 61 6b 65 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fake object name
5450: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   and column list
5460: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
5470: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 6f 66   structure.** of
5480: 20 74 68 65 20 76 69 65 77 2c 20 76 69 72 74 75   the view, virtu
5490: 61 6c 20 74 61 62 6c 65 2c 20 6f 72 20 74 61 62  al table, or tab
54a0: 6c 65 20 76 61 6c 75 65 64 20 66 75 6e 63 74 69  le valued functi
54b0: 6f 6e 20 7a 53 63 68 65 6d 61 2e 7a 4e 61 6d 65  on zSchema.zName
54c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
54d0: 20 2a 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d   *shellFakeSchem
54e0: 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
54f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
5500: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
5510: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 69  nection containi
5520: 6e 67 20 74 68 65 20 76 74 61 62 20 2a 2f 0a 20  ng the vtab */. 
5530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
5540: 68 65 6d 61 2c 20 20 20 20 2f 2a 20 53 63 68 65  hema,    /* Sche
5550: 6d 61 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ma of the databa
5560: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 76  se holding the v
5570: 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tab */.  const c
5580: 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
5590: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
55a0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
55b0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
55c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
55d0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  0;.  char *zSql;
55e0: 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a  .  ShellText s;.
55f0: 20 20 63 68 61 72 20 63 51 75 6f 74 65 3b 0a 20    char cQuote;. 
5600: 20 63 68 61 72 20 2a 7a 44 69 76 20 3d 20 22 28   char *zDiv = "(
5610: 22 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20  ";.  int nRow = 
5620: 30 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  0;..  zSql = sql
5630: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
5640: 41 47 4d 41 20 5c 22 25 77 5c 22 2e 74 61 62 6c  AGMA \"%w\".tabl
5650: 65 5f 69 6e 66 6f 3d 25 51 3b 22 2c 0a 20 20 20  e_info=%Q;",.   
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 20 7a 53 63 68 65 6d 61 20 3f 20        zSchema ? 
5680: 7a 53 63 68 65 6d 61 20 3a 20 22 6d 61 69 6e 22  zSchema : "main"
5690: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  , zName);.  sqli
56a0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
56b0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
56c0: 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
56d0: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
56e0: 20 69 6e 69 74 54 65 78 74 28 26 73 29 3b 0a 20   initText(&s);. 
56f0: 20 69 66 28 20 7a 53 63 68 65 6d 61 20 29 7b 0a   if( zSchema ){.
5700: 20 20 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f      cQuote = quo
5710: 74 65 43 68 61 72 28 7a 53 63 68 65 6d 61 29 3b  teChar(zSchema);
5720: 0a 20 20 20 20 69 66 28 20 63 51 75 6f 74 65 20  .    if( cQuote 
5730: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
5740: 6d 70 28 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70  mp(zSchema,"temp
5750: 22 29 3d 3d 30 20 29 20 63 51 75 6f 74 65 20 3d  ")==0 ) cQuote =
5760: 20 30 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65   0;.    appendTe
5770: 78 74 28 26 73 2c 20 7a 53 63 68 65 6d 61 2c 20  xt(&s, zSchema, 
5780: 63 51 75 6f 74 65 29 3b 0a 20 20 20 20 61 70 70  cQuote);.    app
5790: 65 6e 64 54 65 78 74 28 26 73 2c 20 22 2e 22 2c  endText(&s, ".",
57a0: 20 30 29 3b 0a 20 20 7d 0a 20 20 63 51 75 6f 74   0);.  }.  cQuot
57b0: 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e  e = quoteChar(zN
57c0: 61 6d 65 29 3b 0a 20 20 61 70 70 65 6e 64 54 65  ame);.  appendTe
57d0: 78 74 28 26 73 2c 20 7a 4e 61 6d 65 2c 20 63 51  xt(&s, zName, cQ
57e0: 75 6f 74 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  uote);.  while( 
57f0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
5800: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
5810: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
5820: 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  r *zCol = (const
5830: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
5840: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
5850: 2c 20 31 29 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b  , 1);.    nRow++
5860: 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
5870: 28 26 73 2c 20 7a 44 69 76 2c 20 30 29 3b 0a 20  (&s, zDiv, 0);. 
5880: 20 20 20 7a 44 69 76 20 3d 20 22 2c 22 3b 0a 20     zDiv = ",";. 
5890: 20 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74     cQuote = quot
58a0: 65 43 68 61 72 28 7a 43 6f 6c 29 3b 0a 20 20 20  eChar(zCol);.   
58b0: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
58c0: 7a 43 6f 6c 2c 20 63 51 75 6f 74 65 29 3b 0a 20  zCol, cQuote);. 
58d0: 20 7d 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28   }.  appendText(
58e0: 26 73 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20 73  &s, ")", 0);.  s
58f0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5900: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 6e 52  pStmt);.  if( nR
5910: 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65  ow==0 ){.    fre
5920: 65 54 65 78 74 28 26 73 29 3b 0a 20 20 20 20 73  eText(&s);.    s
5930: 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  .z = 0;.  }.  re
5940: 74 75 72 6e 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a  turn s.z;.}../*.
5950: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  ** SQL function:
5960: 20 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73    shell_module_s
5970: 63 68 65 6d 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52  chema(X).**.** R
5980: 65 74 75 72 6e 20 61 20 66 61 6b 65 20 73 63 68  eturn a fake sch
5990: 65 6d 61 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ema for the tabl
59a0: 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
59b0: 6e 20 6f 72 20 65 70 6f 6e 79 6d 6f 75 73 20 76  n or eponymous v
59c0: 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20  irtual.** table 
59d0: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  X..*/.static voi
59e0: 64 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68  d shellModuleSch
59f0: 65 6d 61 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ema(.  sqlite3_c
5a00: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
5a10: 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69  int nVal,.  sqli
5a20: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
5a30: 6c 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  l.){.  const cha
5a40: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
5a50: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
5a60: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
5a70: 5b 30 5d 29 3b 0a 20 20 63 68 61 72 20 2a 7a 46  [0]);.  char *zF
5a80: 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61 6b 65 53  ake = shellFakeS
5a90: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 5f 63 6f  chema(sqlite3_co
5aa0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
5ab0: 70 43 74 78 29 2c 20 30 2c 20 7a 4e 61 6d 65 29  pCtx), 0, zName)
5ac0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
5ad0: 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20 69 66  ETER(nVal);.  if
5ae0: 28 20 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20 73  ( zFake ){.    s
5af0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5b00: 78 74 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  xt(pCtx, sqlite3
5b10: 5f 6d 70 72 69 6e 74 66 28 22 2f 2a 20 25 73 20  _mprintf("/* %s 
5b20: 2a 2f 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20 20  */", zFake),.   
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 2d 31 2c 20 73 71 6c 69 74 65 33       -1, sqlite3
5b50: 5f 66 72 65 65 29 3b 0a 20 20 20 20 66 72 65 65  _free);.    free
5b60: 28 7a 46 61 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  (zFake);.  }.}..
5b70: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
5b80: 6f 6e 3a 20 20 73 68 65 6c 6c 5f 61 64 64 5f 73  on:  shell_add_s
5b90: 63 68 65 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a  chema(S,X).**.**
5ba0: 20 41 64 64 20 74 68 65 20 73 63 68 65 6d 61 20   Add the schema 
5bb0: 6e 61 6d 65 20 58 20 74 6f 20 74 68 65 20 43 52  name X to the CR
5bc0: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 69  EATE statement i
5bd0: 6e 20 53 20 61 6e 64 20 72 65 74 75 72 6e 20 74  n S and return t
5be0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 20 45 78  he result..** Ex
5bf0: 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  amples:.**.**   
5c00: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
5c10: 28 78 29 20 20 20 2d 3e 20 20 20 43 52 45 41 54  (x)   ->   CREAT
5c20: 45 20 54 41 42 4c 45 20 78 79 7a 2e 74 31 28 78  E TABLE xyz.t1(x
5c30: 29 3b 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f  );.**.** Also wo
5c40: 72 6b 73 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  rks on.**.**    
5c50: 43 52 45 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20  CREATE INDEX.** 
5c60: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
5c70: 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52 45   INDEX.**    CRE
5c80: 41 54 45 20 56 49 45 57 0a 2a 2a 20 20 20 20 43  ATE VIEW.**    C
5c90: 52 45 41 54 45 20 54 52 49 47 47 45 52 0a 2a 2a  REATE TRIGGER.**
5ca0: 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55      CREATE VIRTU
5cb0: 41 4c 20 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54  AL TABLE.**.** T
5cc0: 68 69 73 20 55 44 46 20 69 73 20 75 73 65 64 20  his UDF is used 
5cd0: 62 79 20 74 68 65 20 2e 73 63 68 65 6d 61 20 63  by the .schema c
5ce0: 6f 6d 6d 61 6e 64 20 74 6f 20 69 6e 73 65 72 74  ommand to insert
5cf0: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5d00: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
5d10: 64 61 74 61 62 61 73 65 73 20 69 6e 74 6f 20 74  databases into t
5d20: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
5d30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 2e 73   sqlite_master.s
5d40: 71 6c 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61  ql field..*/.sta
5d50: 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 41 64  tic void shellAd
5d60: 64 53 63 68 65 6d 61 4e 61 6d 65 28 0a 20 20 73  dSchemaName(.  s
5d70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5d80: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
5d90: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5da0: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
5db0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5dc0: 20 2a 61 50 72 65 66 69 78 5b 5d 20 3d 20 7b 0a   *aPrefix[] = {.
5dd0: 20 20 20 20 20 22 54 41 42 4c 45 22 2c 0a 20 20       "TABLE",.  
5de0: 20 20 20 22 49 4e 44 45 58 22 2c 0a 20 20 20 20     "INDEX",.    
5df0: 20 22 55 4e 49 51 55 45 20 49 4e 44 45 58 22 2c   "UNIQUE INDEX",
5e00: 0a 20 20 20 20 20 22 56 49 45 57 22 2c 0a 20 20  .     "VIEW",.  
5e10: 20 20 20 22 54 52 49 47 47 45 52 22 2c 0a 20 20     "TRIGGER",.  
5e20: 20 20 20 22 56 49 52 54 55 41 4c 20 54 41 42 4c     "VIRTUAL TABL
5e30: 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 20  E".  };.  int i 
5e40: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
5e50: 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20  r *zIn = (const 
5e60: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5e70: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
5e80: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
5e90: 20 2a 7a 53 63 68 65 6d 61 20 3d 20 28 63 6f 6e   *zSchema = (con
5ea0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
5eb0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
5ec0: 6c 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  l[1]);.  const c
5ed0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
5ee0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5ef0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
5f00: 61 6c 5b 32 5d 29 3b 0a 20 20 73 71 6c 69 74 65  al[2]);.  sqlite
5f10: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
5f20: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
5f30: 65 28 70 43 74 78 29 3b 0a 20 20 55 4e 55 53 45  e(pCtx);.  UNUSE
5f40: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 56 61 6c  D_PARAMETER(nVal
5f50: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 21 3d 30 20  );.  if( zIn!=0 
5f60: 26 26 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2c 20  && strncmp(zIn, 
5f70: 22 43 52 45 41 54 45 20 22 2c 20 37 29 3d 3d 30  "CREATE ", 7)==0
5f80: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5f90: 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   i<(int)(sizeof(
5fa0: 61 50 72 65 66 69 78 29 2f 73 69 7a 65 6f 66 28  aPrefix)/sizeof(
5fb0: 61 50 72 65 66 69 78 5b 30 5d 29 29 3b 20 69 2b  aPrefix[0])); i+
5fc0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
5fd0: 3d 20 73 74 72 6c 65 6e 33 30 28 61 50 72 65 66  = strlen30(aPref
5fe0: 69 78 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  ix[i]);.      if
5ff0: 28 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c  ( strncmp(zIn+7,
6000: 20 61 50 72 65 66 69 78 5b 69 5d 2c 20 6e 29 3d   aPrefix[i], n)=
6010: 3d 30 20 26 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d  =0 && zIn[n+7]==
6020: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ' ' ){.        c
6030: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
6040: 20 20 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20      char *zFake 
6050: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
6060: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
6070: 20 20 20 20 20 20 63 68 61 72 20 63 51 75 6f 74        char cQuot
6080: 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 53  e = quoteChar(zS
6090: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
60a0: 20 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20    if( cQuote && 
60b0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
60c0: 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 21  zSchema,"temp")!
60d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
60e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
60f0: 72 69 6e 74 66 28 22 25 2e 2a 73 20 5c 22 25 77  rintf("%.*s \"%w
6100: 5c 22 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e  \".%s", n+7, zIn
6110: 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e  , zSchema, zIn+n
6120: 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  +8);.          }
6130: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6140: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
6150: 72 69 6e 74 66 28 22 25 2e 2a 73 20 25 73 2e 25  rintf("%.*s %s.%
6160: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
6170: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
6180: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
61a0: 66 28 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  f( zName.       
61b0: 20 20 26 26 20 61 50 72 65 66 69 78 5b 69 5d 5b    && aPrefix[i][
61c0: 30 5d 3d 3d 27 56 27 0a 20 20 20 20 20 20 20 20  0]=='V'.        
61d0: 20 26 26 20 28 7a 46 61 6b 65 20 3d 20 73 68 65   && (zFake = she
61e0: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 64 62 2c  llFakeSchema(db,
61f0: 20 7a 53 63 68 65 6d 61 2c 20 7a 4e 61 6d 65 29   zSchema, zName)
6200: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
6210: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d            if( z=
6220: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6230: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
6240: 72 69 6e 74 66 28 22 25 73 5c 6e 2f 2a 20 25 73  rintf("%s\n/* %s
6250: 20 2a 2f 22 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65   */", zIn, zFake
6260: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
6270: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6280: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
6290: 6e 74 66 28 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a  ntf("%z\n/* %s *
62a0: 2f 22 2c 20 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20  /", z, zFake);. 
62b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
62c0: 20 20 20 20 20 66 72 65 65 28 7a 46 61 6b 65 29       free(zFake)
62d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
62e0: 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
62f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
6300: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
6310: 20 7a 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f   z, -1, sqlite3_
6320: 66 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  free);.         
6330: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
6340: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6350: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
6360: 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78  esult_value(pCtx
6370: 2c 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a  , apVal[0]);.}..
6380: 2f 2a 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63 65  /*.** The source
6390: 20 63 6f 64 65 20 66 6f 72 20 73 65 76 65 72 61   code for severa
63a0: 6c 20 72 75 6e 2d 74 69 6d 65 20 6c 6f 61 64 61  l run-time loada
63b0: 62 6c 65 20 65 78 74 65 6e 73 69 6f 6e 73 20 69  ble extensions i
63c0: 73 20 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62 65  s inserted.** be
63d0: 6c 6f 77 20 62 79 20 74 68 65 20 2e 2e 2f 74 6f  low by the ../to
63e0: 6f 6c 2f 6d 6b 73 68 65 6c 6c 63 2e 74 63 6c 20  ol/mkshellc.tcl 
63f0: 73 63 72 69 70 74 2e 20 20 42 65 66 6f 72 65 20  script.  Before 
6400: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
6410: 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 63 6f 64 65  included.** code
6420: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6f 76 65  , we need to ove
6430: 72 72 69 64 65 20 73 6f 6d 65 20 6d 61 63 72 6f  rride some macro
6440: 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 69 6e  s to make the in
6450: 63 6c 75 64 65 64 20 70 72 6f 67 72 61 6d 20 63  cluded program c
6460: 6f 64 65 0a 2a 2a 20 77 6f 72 6b 20 68 65 72 65  ode.** work here
6470: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
6480: 66 20 74 68 69 73 20 72 65 67 75 6c 61 72 20 70  f this regular p
6490: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69  rogram..*/.#defi
64a0: 6e 65 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  ne SQLITE_EXTENS
64b0: 49 4f 4e 5f 49 4e 49 54 31 0a 23 64 65 66 69 6e  ION_INIT1.#defin
64c0: 65 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49  e SQLITE_EXTENSI
64d0: 4f 4e 5f 49 4e 49 54 32 28 58 29 20 28 76 6f 69  ON_INIT2(X) (voi
64e0: 64 29 28 58 29 0a 0a 23 69 66 20 64 65 66 69 6e  d)(X)..#if defin
64f0: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 64 65  ed(_WIN32) && de
6500: 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a  fined(_MSC_VER).
6510: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
6530: 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e   test_windirent.
6540: 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h **************
6550: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 32 30 31 35  ****/./*.** 2015
6560: 20 4e 6f 76 65 6d 62 65 72 20 33 30 0a 2a 2a 0a   November 30.**.
6570: 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  ** The author di
6580: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
6590: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
65a0: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
65b0: 20 6f 66 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e   of.** a legal n
65c0: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
65d0: 20 62 6c 65 73 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a   blessing:.**.**
65e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
65f0: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
6600: 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
6610: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
6620: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
6630: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
6640: 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
6650: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
6660: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
6670: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 2a  than you give..*
6680: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
6690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
66d0: 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  his file contain
66e0: 73 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66  s declarations f
66f0: 6f 72 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 6f  or most of the o
6700: 70 65 6e 64 69 72 28 29 20 66 61 6d 69 6c 79 20  pendir() family 
6710: 6f 66 0a 2a 2a 20 50 4f 53 49 58 20 66 75 6e 63  of.** POSIX func
6720: 74 69 6f 6e 73 20 6f 6e 20 57 69 6e 33 32 20 75  tions on Win32 u
6730: 73 69 6e 67 20 74 68 65 20 4d 53 56 43 52 54 2e  sing the MSVCRT.
6740: 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
6750: 28 5f 57 49 4e 33 32 29 20 26 26 20 64 65 66 69  (_WIN32) && defi
6760: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26  ned(_MSC_VER) &&
6770: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6780: 5f 57 49 4e 44 49 52 45 4e 54 5f 48 29 0a 23 64  _WINDIRENT_H).#d
6790: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
67a0: 44 49 52 45 4e 54 5f 48 0a 0a 2f 2a 0a 2a 2a 20  DIRENT_H../*.** 
67b0: 57 65 20 6e 65 65 64 20 73 65 76 65 72 61 6c 20  We need several 
67c0: 64 61 74 61 20 74 79 70 65 73 20 66 72 6f 6d 20  data types from 
67d0: 74 68 65 20 57 69 6e 64 6f 77 73 20 53 44 4b 20  the Windows SDK 
67e0: 68 65 61 64 65 72 2e 0a 2a 2f 0a 0a 23 69 66 6e  header..*/..#ifn
67f0: 64 65 66 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41  def WIN32_LEAN_A
6800: 4e 44 5f 4d 45 41 4e 0a 23 64 65 66 69 6e 65 20  ND_MEAN.#define 
6810: 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d  WIN32_LEAN_AND_M
6820: 45 41 4e 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63  EAN.#endif..#inc
6830: 6c 75 64 65 20 22 77 69 6e 64 6f 77 73 2e 68 22  lude "windows.h"
6840: 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 6e 65 65 64 20  ../*.** We need 
6850: 73 65 76 65 72 61 6c 20 73 75 70 70 6f 72 74 20  several support 
6860: 66 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 74  functions from t
6870: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a  he SQLite core..
6880: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 6e 65  */.../*.** We ne
6890: 65 64 20 73 65 76 65 72 61 6c 20 74 68 69 6e 67  ed several thing
68a0: 73 20 66 72 6f 6d 20 74 68 65 20 41 4e 53 49 20  s from the ANSI 
68b0: 61 6e 64 20 4d 53 56 43 52 54 20 68 65 61 64 65  and MSVCRT heade
68c0: 72 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  rs..*/..#include
68d0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
68e0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
68f0: 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68  include <errno.h
6900: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68  >.#include <io.h
6910: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69  >.#include <limi
6920: 74 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ts.h>.#include <
6930: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
6940: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
6950: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 6d 61 79  h>../*.** We may
6960: 20 6e 65 65 64 20 73 65 76 65 72 61 6c 20 64 65   need several de
6970: 66 69 6e 65 73 20 74 68 61 74 20 73 68 6f 75 6c  fines that shoul
6980: 64 20 68 61 76 65 20 62 65 65 6e 20 69 6e 20 22  d have been in "
6990: 73 79 73 2f 73 74 61 74 2e 68 22 2e 0a 2a 2f 0a  sys/stat.h"..*/.
69a0: 0a 23 69 66 6e 64 65 66 20 53 5f 49 53 52 45 47  .#ifndef S_ISREG
69b0: 0a 23 64 65 66 69 6e 65 20 53 5f 49 53 52 45 47  .#define S_ISREG
69c0: 28 6d 6f 64 65 29 20 28 28 28 6d 6f 64 65 29 20  (mode) (((mode) 
69d0: 26 20 53 5f 49 46 4d 54 29 20 3d 3d 20 53 5f 49  & S_IFMT) == S_I
69e0: 46 52 45 47 29 0a 23 65 6e 64 69 66 0a 0a 23 69  FREG).#endif..#i
69f0: 66 6e 64 65 66 20 53 5f 49 53 44 49 52 0a 23 64  fndef S_ISDIR.#d
6a00: 65 66 69 6e 65 20 53 5f 49 53 44 49 52 28 6d 6f  efine S_ISDIR(mo
6a10: 64 65 29 20 28 28 28 6d 6f 64 65 29 20 26 20 53  de) (((mode) & S
6a20: 5f 49 46 4d 54 29 20 3d 3d 20 53 5f 49 46 44 49  _IFMT) == S_IFDI
6a30: 52 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  R).#endif..#ifnd
6a40: 65 66 20 53 5f 49 53 4c 4e 4b 0a 23 64 65 66 69  ef S_ISLNK.#defi
6a50: 6e 65 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65 29  ne S_ISLNK(mode)
6a60: 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (0).#endif../*.
6a70: 2a 2a 20 57 65 20 6d 61 79 20 6e 65 65 64 20 74  ** We may need t
6a80: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 22 6d  o provide the "m
6a90: 6f 64 65 5f 74 22 20 74 79 70 65 2e 0a 2a 2f 0a  ode_t" type..*/.
6aa0: 0a 23 69 66 6e 64 65 66 20 4d 4f 44 45 5f 54 5f  .#ifndef MODE_T_
6ab0: 44 45 46 49 4e 45 44 0a 20 20 23 64 65 66 69 6e  DEFINED.  #defin
6ac0: 65 20 4d 4f 44 45 5f 54 5f 44 45 46 49 4e 45 44  e MODE_T_DEFINED
6ad0: 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69 67  .  typedef unsig
6ae0: 6e 65 64 20 73 68 6f 72 74 20 6d 6f 64 65 5f 74  ned short mode_t
6af0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
6b00: 57 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 70  We may need to p
6b10: 72 6f 76 69 64 65 20 74 68 65 20 22 69 6e 6f 5f  rovide the "ino_
6b20: 74 22 20 74 79 70 65 2e 0a 2a 2f 0a 0a 23 69 66  t" type..*/..#if
6b30: 6e 64 65 66 20 49 4e 4f 5f 54 5f 44 45 46 49 4e  ndef INO_T_DEFIN
6b40: 45 44 0a 20 20 23 64 65 66 69 6e 65 20 49 4e 4f  ED.  #define INO
6b50: 5f 54 5f 44 45 46 49 4e 45 44 0a 20 20 74 79 70  _T_DEFINED.  typ
6b60: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68  edef unsigned sh
6b70: 6f 72 74 20 69 6e 6f 5f 74 3b 0a 23 65 6e 64 69  ort ino_t;.#endi
6b80: 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 6e 65 65 64  f../*.** We need
6b90: 20 74 6f 20 64 65 66 69 6e 65 20 22 4e 41 4d 45   to define "NAME
6ba0: 5f 4d 41 58 22 20 69 66 20 69 74 20 77 61 73 20  _MAX" if it was 
6bb0: 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 22  not present in "
6bc0: 6c 69 6d 69 74 73 2e 68 22 2e 0a 2a 2f 0a 0a 23  limits.h"..*/..#
6bd0: 69 66 6e 64 65 66 20 4e 41 4d 45 5f 4d 41 58 0a  ifndef NAME_MAX.
6be0: 23 20 20 69 66 64 65 66 20 46 49 4c 45 4e 41 4d  #  ifdef FILENAM
6bf0: 45 5f 4d 41 58 0a 23 20 20 20 20 64 65 66 69 6e  E_MAX.#    defin
6c00: 65 20 4e 41 4d 45 5f 4d 41 58 20 28 46 49 4c 45  e NAME_MAX (FILE
6c10: 4e 41 4d 45 5f 4d 41 58 29 0a 23 20 20 65 6c 73  NAME_MAX).#  els
6c20: 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 4e 41  e.#    define NA
6c30: 4d 45 5f 4d 41 58 20 28 32 36 30 29 0a 23 20 20  ME_MAX (260).#  
6c40: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
6c50: 0a 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 64  .** We need to d
6c60: 65 66 69 6e 65 20 22 4e 55 4c 4c 5f 49 4e 54 50  efine "NULL_INTP
6c70: 54 52 5f 54 22 20 61 6e 64 20 22 42 41 44 5f 49  TR_T" and "BAD_I
6c80: 4e 54 50 54 52 5f 54 22 2e 0a 2a 2f 0a 0a 23 69  NTPTR_T"..*/..#i
6c90: 66 6e 64 65 66 20 4e 55 4c 4c 5f 49 4e 54 50 54  fndef NULL_INTPT
6ca0: 52 5f 54 0a 23 20 20 64 65 66 69 6e 65 20 4e 55  R_T.#  define NU
6cb0: 4c 4c 5f 49 4e 54 50 54 52 5f 54 20 28 28 69 6e  LL_INTPTR_T ((in
6cc0: 74 70 74 72 5f 74 29 28 30 29 29 0a 23 65 6e 64  tptr_t)(0)).#end
6cd0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 42 41 44 5f  if..#ifndef BAD_
6ce0: 49 4e 54 50 54 52 5f 54 0a 23 20 20 64 65 66 69  INTPTR_T.#  defi
6cf0: 6e 65 20 42 41 44 5f 49 4e 54 50 54 52 5f 54 20  ne BAD_INTPTR_T 
6d00: 28 28 69 6e 74 70 74 72 5f 74 29 28 2d 31 29 29  ((intptr_t)(-1))
6d10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
6d20: 65 20 6e 65 65 64 20 74 6f 20 70 72 6f 76 69 64  e need to provid
6d30: 65 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  e the necessary 
6d40: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 72  structures and r
6d50: 65 6c 61 74 65 64 20 74 79 70 65 73 2e 0a 2a 2f  elated types..*/
6d60: 0a 0a 23 69 66 6e 64 65 66 20 44 49 52 45 4e 54  ..#ifndef DIRENT
6d70: 5f 44 45 46 49 4e 45 44 0a 23 64 65 66 69 6e 65  _DEFINED.#define
6d80: 20 44 49 52 45 4e 54 5f 44 45 46 49 4e 45 44 0a   DIRENT_DEFINED.
6d90: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44  typedef struct D
6da0: 49 52 45 4e 54 20 44 49 52 45 4e 54 3b 0a 74 79  IRENT DIRENT;.ty
6db0: 70 65 64 65 66 20 44 49 52 45 4e 54 20 2a 4c 50  pedef DIRENT *LP
6dc0: 44 49 52 45 4e 54 3b 0a 73 74 72 75 63 74 20 44  DIRENT;.struct D
6dd0: 49 52 45 4e 54 20 7b 0a 20 20 69 6e 6f 5f 74 20  IRENT {.  ino_t 
6de0: 64 5f 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  d_ino;          
6df0: 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 63 65       /* Sequence
6e00: 20 6e 75 6d 62 65 72 2c 20 64 6f 20 6e 6f 74 20   number, do not 
6e10: 75 73 65 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  use. */.  unsign
6e20: 65 64 20 64 5f 61 74 74 72 69 62 75 74 65 73 3b  ed d_attributes;
6e30: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 66 69       /* Win32 fi
6e40: 6c 65 20 61 74 74 72 69 62 75 74 65 73 2e 20 2a  le attributes. *
6e50: 2f 0a 20 20 63 68 61 72 20 64 5f 6e 61 6d 65 5b  /.  char d_name[
6e60: 4e 41 4d 45 5f 4d 41 58 20 2b 20 31 5d 3b 20 2f  NAME_MAX + 1]; /
6e70: 2a 20 4e 61 6d 65 20 77 69 74 68 69 6e 20 74 68  * Name within th
6e80: 65 20 64 69 72 65 63 74 6f 72 79 2e 20 2a 2f 0a  e directory. */.
6e90: 7d 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  };.#endif..#ifnd
6ea0: 65 66 20 44 49 52 5f 44 45 46 49 4e 45 44 0a 23  ef DIR_DEFINED.#
6eb0: 64 65 66 69 6e 65 20 44 49 52 5f 44 45 46 49 4e  define DIR_DEFIN
6ec0: 45 44 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ED.typedef struc
6ed0: 74 20 44 49 52 20 44 49 52 3b 0a 74 79 70 65 64  t DIR DIR;.typed
6ee0: 65 66 20 44 49 52 20 2a 4c 50 44 49 52 3b 0a 73  ef DIR *LPDIR;.s
6ef0: 74 72 75 63 74 20 44 49 52 20 7b 0a 20 20 69 6e  truct DIR {.  in
6f00: 74 70 74 72 5f 74 20 64 5f 68 61 6e 64 6c 65 3b  tptr_t d_handle;
6f10: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
6f20: 65 64 20 62 79 20 22 5f 66 69 6e 64 66 69 72 73  ed by "_findfirs
6f30: 74 22 2e 20 2a 2f 0a 20 20 44 49 52 45 4e 54 20  t". */.  DIRENT 
6f40: 64 5f 66 69 72 73 74 3b 20 20 20 20 2f 2a 20 44  d_first;    /* D
6f50: 49 52 45 4e 54 20 63 6f 6e 73 74 72 75 63 74 65  IRENT constructe
6f60: 64 20 62 61 73 65 64 20 6f 6e 20 22 5f 66 69 6e  d based on "_fin
6f70: 64 66 69 72 73 74 22 2e 20 2a 2f 0a 20 20 44 49  dfirst". */.  DI
6f80: 52 45 4e 54 20 64 5f 6e 65 78 74 3b 20 20 20 20  RENT d_next;    
6f90: 20 2f 2a 20 44 49 52 45 4e 54 20 63 6f 6e 73 74   /* DIRENT const
6fa0: 72 75 63 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ructed based on 
6fb0: 22 5f 66 69 6e 64 6e 65 78 74 22 2e 20 2a 2f 0a  "_findnext". */.
6fc0: 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  };.#endif../*.**
6fd0: 20 50 72 6f 76 69 64 65 20 61 20 6d 61 63 72 6f   Provide a macro
6fe0: 2c 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  , for use by the
6ff0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c   implementation,
7000: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
7010: 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72   a.** particular
7020: 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
7030: 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69 70 70   should be skipp
7040: 65 64 20 6f 76 65 72 20 77 68 65 6e 20 73 65 61  ed over when sea
7050: 72 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 68  rching for.** th
7060: 65 20 6e 65 78 74 20 64 69 72 65 63 74 6f 72 79  e next directory
7070: 20 65 6e 74 72 79 20 74 68 61 74 20 73 68 6f 75   entry that shou
7080: 6c 64 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ld be returned b
7090: 79 20 74 68 65 20 72 65 61 64 64 69 72 28 29 20  y the readdir() 
70a0: 6f 72 0a 2a 2a 20 72 65 61 64 64 69 72 5f 72 28  or.** readdir_r(
70b0: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ) functions..*/.
70c0: 0a 23 69 66 6e 64 65 66 20 69 73 5f 66 69 6c 74  .#ifndef is_filt
70d0: 65 72 65 64 0a 23 20 20 64 65 66 69 6e 65 20 69  ered.#  define i
70e0: 73 5f 66 69 6c 74 65 72 65 64 28 61 29 20 28 28  s_filtered(a) ((
70f0: 28 28 61 29 2e 61 74 74 72 69 62 29 26 5f 41 5f  ((a).attrib)&_A_
7100: 48 49 44 44 45 4e 29 20 7c 7c 20 28 28 28 61 29  HIDDEN) || (((a)
7110: 2e 61 74 74 72 69 62 29 26 5f 41 5f 53 59 53 54  .attrib)&_A_SYST
7120: 45 4d 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  EM)).#endif../*.
7130: 2a 2a 20 50 72 6f 76 69 64 65 20 74 68 65 20 66  ** Provide the f
7140: 75 6e 63 74 69 6f 6e 20 70 72 6f 74 6f 74 79 70  unction prototyp
7150: 65 20 66 6f 72 20 74 68 65 20 50 4f 53 49 58 20  e for the POSIX 
7160: 63 6f 6d 70 61 74 69 61 62 6c 65 20 67 65 74 65  compatiable gete
7170: 6e 76 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  nv().** function
7180: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7190: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 2d 73   is not thread-s
71a0: 61 66 65 2e 0a 2a 2f 0a 0a 65 78 74 65 72 6e 20  afe..*/..extern 
71b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 64  const char *wind
71c0: 69 72 65 6e 74 5f 67 65 74 65 6e 76 28 63 6f 6e  irent_getenv(con
71d0: 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 29 3b 0a  st char *name);.
71e0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  ./*.** Finally, 
71f0: 77 65 20 63 61 6e 20 70 72 6f 76 69 64 65 20 74  we can provide t
7200: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 6f 74  he function prot
7210: 6f 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6f  otypes for the o
7220: 70 65 6e 64 69 72 28 29 2c 0a 2a 2a 20 72 65 61  pendir(),.** rea
7230: 64 64 69 72 28 29 2c 20 72 65 61 64 64 69 72 5f  ddir(), readdir_
7240: 72 28 29 2c 20 61 6e 64 20 63 6c 6f 73 65 64 69  r(), and closedi
7250: 72 28 29 20 50 4f 53 49 58 20 66 75 6e 63 74 69  r() POSIX functi
7260: 6f 6e 73 2e 0a 2a 2f 0a 0a 65 78 74 65 72 6e 20  ons..*/..extern 
7270: 4c 50 44 49 52 20 6f 70 65 6e 64 69 72 28 63 6f  LPDIR opendir(co
7280: 6e 73 74 20 63 68 61 72 20 2a 64 69 72 6e 61 6d  nst char *dirnam
7290: 65 29 3b 0a 65 78 74 65 72 6e 20 4c 50 44 49 52  e);.extern LPDIR
72a0: 45 4e 54 20 72 65 61 64 64 69 72 28 4c 50 44 49  ENT readdir(LPDI
72b0: 52 20 64 69 72 70 29 3b 0a 65 78 74 65 72 6e 20  R dirp);.extern 
72c0: 49 4e 54 20 72 65 61 64 64 69 72 5f 72 28 4c 50  INT readdir_r(LP
72d0: 44 49 52 20 64 69 72 70 2c 20 4c 50 44 49 52 45  DIR dirp, LPDIRE
72e0: 4e 54 20 65 6e 74 72 79 2c 20 4c 50 44 49 52 45  NT entry, LPDIRE
72f0: 4e 54 20 2a 72 65 73 75 6c 74 29 3b 0a 65 78 74  NT *result);.ext
7300: 65 72 6e 20 49 4e 54 20 63 6c 6f 73 65 64 69 72  ern INT closedir
7310: 28 4c 50 44 49 52 20 64 69 72 70 29 3b 0a 0a 23  (LPDIR dirp);..#
7320: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
7330: 28 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e  (WIN32) && defin
7340: 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 2a 2f 0a  ed(_MSC_VER) */.
7350: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
7370: 74 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e 68  test_windirent.h
7380: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
7390: 2a 2a 2a 2a 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  *****/./********
73a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
73b0: 2a 20 42 65 67 69 6e 20 74 65 73 74 5f 77 69 6e  * Begin test_win
73c0: 64 69 72 65 6e 74 2e 63 20 2a 2a 2a 2a 2a 2a 2a  dirent.c *******
73d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
73e0: 2a 2a 20 32 30 31 35 20 4e 6f 76 65 6d 62 65 72  ** 2015 November
73f0: 20 33 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   30.**.** The au
7400: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
7410: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
7420: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
7430: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
7440: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
7450: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
7460: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
7470: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
7480: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
7490: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
74a0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
74b0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
74c0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
74d0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
74e0: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
74f0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
7500: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
7560: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f  contains code to
7570: 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 6f 73 74 20   implement most 
7580: 6f 66 20 74 68 65 20 6f 70 65 6e 64 69 72 28 29  of the opendir()
7590: 20 66 61 6d 69 6c 79 20 6f 66 0a 2a 2a 20 50 4f   family of.** PO
75a0: 53 49 58 20 66 75 6e 63 74 69 6f 6e 73 20 6f 6e  SIX functions on
75b0: 20 57 69 6e 33 32 20 75 73 69 6e 67 20 74 68 65   Win32 using the
75c0: 20 4d 53 56 43 52 54 2e 0a 2a 2f 0a 0a 23 69 66   MSVCRT..*/..#if
75d0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
75e0: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 53 43   && defined(_MSC
75f0: 5f 56 45 52 29 0a 2f 2a 20 23 69 6e 63 6c 75 64  _VER)./* #includ
7600: 65 20 22 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  e "test_windiren
7610: 74 2e 68 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  t.h" */../*.** I
7620: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
7630: 20 74 68 65 20 50 4f 53 49 58 20 67 65 74 65 6e   the POSIX geten
7640: 76 28 29 20 66 75 6e 63 74 69 6f 6e 20 75 73 69  v() function usi
7650: 6e 67 20 74 68 65 20 57 69 6e 33 32 20 41 50 49  ng the Win32 API
7660: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
7670: 6f 6e 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  on is not thread
7680: 2d 73 61 66 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  -safe..*/.const 
7690: 63 68 61 72 20 2a 77 69 6e 64 69 72 65 6e 74 5f  char *windirent_
76a0: 67 65 74 65 6e 76 28 0a 20 20 63 6f 6e 73 74 20  getenv(.  const 
76b0: 63 68 61 72 20 2a 6e 61 6d 65 0a 29 7b 0a 20 20  char *name.){.  
76c0: 73 74 61 74 69 63 20 63 68 61 72 20 76 61 6c 75  static char valu
76d0: 65 5b 33 32 37 36 38 5d 3b 20 2f 2a 20 4d 61 78  e[32768]; /* Max
76e0: 69 6d 75 6d 20 6c 65 6e 67 74 68 2c 20 70 65 72  imum length, per
76f0: 20 4d 53 44 4e 20 2a 2f 0a 20 20 44 57 4f 52 44   MSDN */.  DWORD
7700: 20 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66   dwSize = sizeof
7710: 28 76 61 6c 75 65 29 20 2f 20 73 69 7a 65 6f 66  (value) / sizeof
7720: 28 63 68 61 72 29 3b 20 2f 2a 20 53 69 7a 65 20  (char); /* Size 
7730: 69 6e 20 63 68 61 72 73 20 2a 2f 0a 20 20 44 57  in chars */.  DW
7740: 4f 52 44 20 64 77 52 65 74 3b 20 2f 2a 20 56 61  ORD dwRet; /* Va
7750: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7760: 47 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61  GetEnvironmentVa
7770: 72 69 61 62 6c 65 41 28 29 20 2a 2f 0a 0a 20 20  riableA() */..  
7780: 6d 65 6d 73 65 74 28 76 61 6c 75 65 2c 20 30 2c  memset(value, 0,
7790: 20 73 69 7a 65 6f 66 28 76 61 6c 75 65 29 29 3b   sizeof(value));
77a0: 0a 20 20 64 77 52 65 74 20 3d 20 47 65 74 45 6e  .  dwRet = GetEn
77b0: 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
77c0: 65 41 28 6e 61 6d 65 2c 20 76 61 6c 75 65 2c 20  eA(name, value, 
77d0: 64 77 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 64  dwSize);.  if( d
77e0: 77 52 65 74 3d 3d 30 20 7c 7c 20 64 77 52 65 74  wRet==0 || dwRet
77f0: 3e 64 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f  >dwSize ){.    /
7800: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 75 6e  *.    ** The fun
7810: 63 74 69 6f 6e 20 63 61 6c 6c 20 74 6f 20 47 65  ction call to Ge
7820: 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69  tEnvironmentVari
7830: 61 62 6c 65 41 28 29 20 66 61 69 6c 65 64 20 2d  ableA() failed -
7840: 4f 52 2d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  OR-.    ** the b
7850: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6c 61 72  uffer is not lar
7860: 67 65 20 65 6e 6f 75 67 68 2e 20 20 45 69 74 68  ge enough.  Eith
7870: 65 72 20 77 61 79 2c 20 72 65 74 75 72 6e 20 4e  er way, return N
7880: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
7890: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
78a0: 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e{.    /*.    **
78b0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   The function ca
78c0: 6c 6c 20 74 6f 20 47 65 74 45 6e 76 69 72 6f 6e  ll to GetEnviron
78d0: 6d 65 6e 74 56 61 72 69 61 62 6c 65 41 28 29 20  mentVariableA() 
78e0: 73 75 63 63 65 65 64 65 64 0a 20 20 20 20 2a 2a  succeeded.    **
78f0: 20 2d 41 4e 44 2d 20 74 68 65 20 62 75 66 66 65   -AND- the buffe
7900: 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  r contains the e
7910: 6e 74 69 72 65 20 76 61 6c 75 65 2e 0a 20 20 20  ntire value..   
7920: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 76   */.    return v
7930: 61 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  alue;.  }.}../*.
7940: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
7950: 6e 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 6f  n of the POSIX o
7960: 70 65 6e 64 69 72 28 29 20 66 75 6e 63 74 69 6f  pendir() functio
7970: 6e 20 75 73 69 6e 67 20 74 68 65 20 4d 53 56 43  n using the MSVC
7980: 52 54 2e 0a 2a 2f 0a 4c 50 44 49 52 20 6f 70 65  RT..*/.LPDIR ope
7990: 6e 64 69 72 28 0a 20 20 63 6f 6e 73 74 20 63 68  ndir(.  const ch
79a0: 61 72 20 2a 64 69 72 6e 61 6d 65 0a 29 7b 0a 20  ar *dirname.){. 
79b0: 20 73 74 72 75 63 74 20 5f 66 69 6e 64 64 61 74   struct _finddat
79c0: 61 5f 74 20 64 61 74 61 3b 0a 20 20 4c 50 44 49  a_t data;.  LPDI
79d0: 52 20 64 69 72 70 20 3d 20 28 4c 50 44 49 52 29  R dirp = (LPDIR)
79e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
79f0: 69 7a 65 6f 66 28 44 49 52 29 29 3b 0a 20 20 53  izeof(DIR));.  S
7a00: 49 5a 45 5f 54 20 6e 61 6d 65 73 69 7a 65 20 3d  IZE_T namesize =
7a10: 20 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e 61 6d   sizeof(data.nam
7a20: 65 29 20 2f 20 73 69 7a 65 6f 66 28 64 61 74 61  e) / sizeof(data
7a30: 2e 6e 61 6d 65 5b 30 5d 29 3b 0a 0a 20 20 69 66  .name[0]);..  if
7a40: 28 20 64 69 72 70 3d 3d 4e 55 4c 4c 20 29 20 72  ( dirp==NULL ) r
7a50: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 6d 65  eturn NULL;.  me
7a60: 6d 73 65 74 28 64 69 72 70 2c 20 30 2c 20 73 69  mset(dirp, 0, si
7a70: 7a 65 6f 66 28 44 49 52 29 29 3b 0a 0a 20 20 2f  zeof(DIR));..  /
7a80: 2a 20 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74  * TODO: Remove t
7a90: 68 69 73 20 69 66 20 55 6e 69 78 2d 73 74 79 6c  his if Unix-styl
7aa0: 65 20 72 6f 6f 74 20 70 61 74 68 73 20 61 72 65  e root paths are
7ab0: 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20   not used. */.  
7ac0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
7ad0: 63 6d 70 28 64 69 72 6e 61 6d 65 2c 20 22 2f 22  cmp(dirname, "/"
7ae0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 72 6e  )==0 ){.    dirn
7af0: 61 6d 65 20 3d 20 77 69 6e 64 69 72 65 6e 74 5f  ame = windirent_
7b00: 67 65 74 65 6e 76 28 22 53 79 73 74 65 6d 44 72  getenv("SystemDr
7b10: 69 76 65 22 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65  ive");.  }..  me
7b20: 6d 73 65 74 28 26 64 61 74 61 2c 20 30 2c 20 73  mset(&data, 0, s
7b30: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 5f 66 69  izeof(struct _fi
7b40: 6e 64 64 61 74 61 5f 74 29 29 3b 0a 20 20 5f 73  nddata_t));.  _s
7b50: 6e 70 72 69 6e 74 66 28 64 61 74 61 2e 6e 61 6d  nprintf(data.nam
7b60: 65 2c 20 6e 61 6d 65 73 69 7a 65 2c 20 22 25 73  e, namesize, "%s
7b70: 5c 5c 2a 22 2c 20 64 69 72 6e 61 6d 65 29 3b 0a  \\*", dirname);.
7b80: 20 20 64 69 72 70 2d 3e 64 5f 68 61 6e 64 6c 65    dirp->d_handle
7b90: 20 3d 20 5f 66 69 6e 64 66 69 72 73 74 28 64 61   = _findfirst(da
7ba0: 74 61 2e 6e 61 6d 65 2c 20 26 64 61 74 61 29 3b  ta.name, &data);
7bb0: 0a 0a 20 20 69 66 28 20 64 69 72 70 2d 3e 64 5f  ..  if( dirp->d_
7bc0: 68 61 6e 64 6c 65 3d 3d 42 41 44 5f 49 4e 54 50  handle==BAD_INTP
7bd0: 54 52 5f 54 20 29 7b 0a 20 20 20 20 63 6c 6f 73  TR_T ){.    clos
7be0: 65 64 69 72 28 64 69 72 70 29 3b 0a 20 20 20 20  edir(dirp);.    
7bf0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 7d  return NULL;.  }
7c00: 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 52 65 6d  ..  /* TODO: Rem
7c10: 6f 76 65 20 74 68 69 73 20 62 6c 6f 63 6b 20 74  ove this block t
7c20: 6f 20 61 6c 6c 6f 77 20 68 69 64 64 65 6e 20 61  o allow hidden a
7c30: 6e 64 2f 6f 72 20 73 79 73 74 65 6d 20 66 69 6c  nd/or system fil
7c40: 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 73 5f  es. */.  if( is_
7c50: 66 69 6c 74 65 72 65 64 28 64 61 74 61 29 20 29  filtered(data) )
7c60: 7b 0a 6e 65 78 74 3a 0a 0a 20 20 20 20 6d 65 6d  {.next:..    mem
7c70: 73 65 74 28 26 64 61 74 61 2c 20 30 2c 20 73 69  set(&data, 0, si
7c80: 7a 65 6f 66 28 73 74 72 75 63 74 20 5f 66 69 6e  zeof(struct _fin
7c90: 64 64 61 74 61 5f 74 29 29 3b 0a 20 20 20 20 69  ddata_t));.    i
7ca0: 66 28 20 5f 66 69 6e 64 6e 65 78 74 28 64 69 72  f( _findnext(dir
7cb0: 70 2d 3e 64 5f 68 61 6e 64 6c 65 2c 20 26 64 61  p->d_handle, &da
7cc0: 74 61 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  ta)==-1 ){.     
7cd0: 20 63 6c 6f 73 65 64 69 72 28 64 69 72 70 29 3b   closedir(dirp);
7ce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 55  .      return NU
7cf0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
7d00: 2a 20 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74  * TODO: Remove t
7d10: 68 69 73 20 62 6c 6f 63 6b 20 74 6f 20 61 6c 6c  his block to all
7d20: 6f 77 20 68 69 64 64 65 6e 20 61 6e 64 2f 6f 72  ow hidden and/or
7d30: 20 73 79 73 74 65 6d 20 66 69 6c 65 73 2e 20 2a   system files. *
7d40: 2f 0a 20 20 20 20 69 66 28 20 69 73 5f 66 69 6c  /.    if( is_fil
7d50: 74 65 72 65 64 28 64 61 74 61 29 20 29 20 67 6f  tered(data) ) go
7d60: 74 6f 20 6e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  to next;.  }..  
7d70: 64 69 72 70 2d 3e 64 5f 66 69 72 73 74 2e 64 5f  dirp->d_first.d_
7d80: 61 74 74 72 69 62 75 74 65 73 20 3d 20 64 61 74  attributes = dat
7d90: 61 2e 61 74 74 72 69 62 3b 0a 20 20 73 74 72 6e  a.attrib;.  strn
7da0: 63 70 79 28 64 69 72 70 2d 3e 64 5f 66 69 72 73  cpy(dirp->d_firs
7db0: 74 2e 64 5f 6e 61 6d 65 2c 20 64 61 74 61 2e 6e  t.d_name, data.n
7dc0: 61 6d 65 2c 20 4e 41 4d 45 5f 4d 41 58 29 3b 0a  ame, NAME_MAX);.
7dd0: 20 20 64 69 72 70 2d 3e 64 5f 66 69 72 73 74 2e    dirp->d_first.
7de0: 64 5f 6e 61 6d 65 5b 4e 41 4d 45 5f 4d 41 58 5d  d_name[NAME_MAX]
7df0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 65 74 75   = '\0';..  retu
7e00: 72 6e 20 64 69 72 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn dirp;.}../*.*
7e10: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
7e20: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 72 65   of the POSIX re
7e30: 61 64 64 69 72 28 29 20 66 75 6e 63 74 69 6f 6e  addir() function
7e40: 20 75 73 69 6e 67 20 74 68 65 20 4d 53 56 43 52   using the MSVCR
7e50: 54 2e 0a 2a 2f 0a 4c 50 44 49 52 45 4e 54 20 72  T..*/.LPDIRENT r
7e60: 65 61 64 64 69 72 28 0a 20 20 4c 50 44 49 52 20  eaddir(.  LPDIR 
7e70: 64 69 72 70 0a 29 7b 0a 20 20 73 74 72 75 63 74  dirp.){.  struct
7e80: 20 5f 66 69 6e 64 64 61 74 61 5f 74 20 64 61 74   _finddata_t dat
7e90: 61 3b 0a 0a 20 20 69 66 28 20 64 69 72 70 3d 3d  a;..  if( dirp==
7ea0: 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 20 4e 55  NULL ) return NU
7eb0: 4c 4c 3b 0a 0a 20 20 69 66 28 20 64 69 72 70 2d  LL;..  if( dirp-
7ec0: 3e 64 5f 66 69 72 73 74 2e 64 5f 69 6e 6f 3d 3d  >d_first.d_ino==
7ed0: 30 20 29 7b 0a 20 20 20 20 64 69 72 70 2d 3e 64  0 ){.    dirp->d
7ee0: 5f 66 69 72 73 74 2e 64 5f 69 6e 6f 2b 2b 3b 0a  _first.d_ino++;.
7ef0: 20 20 20 20 64 69 72 70 2d 3e 64 5f 6e 65 78 74      dirp->d_next
7f00: 2e 64 5f 69 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 72  .d_ino++;..    r
7f10: 65 74 75 72 6e 20 26 64 69 72 70 2d 3e 64 5f 66  eturn &dirp->d_f
7f20: 69 72 73 74 3b 0a 20 20 7d 0a 0a 6e 65 78 74 3a  irst;.  }..next:
7f30: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ..  memset(&data
7f40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  , 0, sizeof(stru
7f50: 63 74 20 5f 66 69 6e 64 64 61 74 61 5f 74 29 29  ct _finddata_t))
7f60: 3b 0a 20 20 69 66 28 20 5f 66 69 6e 64 6e 65 78  ;.  if( _findnex
7f70: 74 28 64 69 72 70 2d 3e 64 5f 68 61 6e 64 6c 65  t(dirp->d_handle
7f80: 2c 20 26 64 61 74 61 29 3d 3d 2d 31 20 29 20 72  , &data)==-1 ) r
7f90: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 2f  eturn NULL;..  /
7fa0: 2a 20 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74  * TODO: Remove t
7fb0: 68 69 73 20 62 6c 6f 63 6b 20 74 6f 20 61 6c 6c  his block to all
7fc0: 6f 77 20 68 69 64 64 65 6e 20 61 6e 64 2f 6f 72  ow hidden and/or
7fd0: 20 73 79 73 74 65 6d 20 66 69 6c 65 73 2e 20 2a   system files. *
7fe0: 2f 0a 20 20 69 66 28 20 69 73 5f 66 69 6c 74 65  /.  if( is_filte
7ff0: 72 65 64 28 64 61 74 61 29 20 29 20 67 6f 74 6f  red(data) ) goto
8000: 20 6e 65 78 74 3b 0a 0a 20 20 64 69 72 70 2d 3e   next;..  dirp->
8010: 64 5f 6e 65 78 74 2e 64 5f 69 6e 6f 2b 2b 3b 0a  d_next.d_ino++;.
8020: 20 20 64 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64    dirp->d_next.d
8030: 5f 61 74 74 72 69 62 75 74 65 73 20 3d 20 64 61  _attributes = da
8040: 74 61 2e 61 74 74 72 69 62 3b 0a 20 20 73 74 72  ta.attrib;.  str
8050: 6e 63 70 79 28 64 69 72 70 2d 3e 64 5f 6e 65 78  ncpy(dirp->d_nex
8060: 74 2e 64 5f 6e 61 6d 65 2c 20 64 61 74 61 2e 6e  t.d_name, data.n
8070: 61 6d 65 2c 20 4e 41 4d 45 5f 4d 41 58 29 3b 0a  ame, NAME_MAX);.
8080: 20 20 64 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64    dirp->d_next.d
8090: 5f 6e 61 6d 65 5b 4e 41 4d 45 5f 4d 41 58 5d 20  _name[NAME_MAX] 
80a0: 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 65 74 75 72  = '\0';..  retur
80b0: 6e 20 26 64 69 72 70 2d 3e 64 5f 6e 65 78 74 3b  n &dirp->d_next;
80c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
80d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
80e0: 50 4f 53 49 58 20 72 65 61 64 64 69 72 5f 72 28  POSIX readdir_r(
80f0: 29 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67  ) function using
8100: 20 74 68 65 20 4d 53 56 43 52 54 2e 0a 2a 2f 0a   the MSVCRT..*/.
8110: 49 4e 54 20 72 65 61 64 64 69 72 5f 72 28 0a 20  INT readdir_r(. 
8120: 20 4c 50 44 49 52 20 64 69 72 70 2c 0a 20 20 4c   LPDIR dirp,.  L
8130: 50 44 49 52 45 4e 54 20 65 6e 74 72 79 2c 0a 20  PDIRENT entry,. 
8140: 20 4c 50 44 49 52 45 4e 54 20 2a 72 65 73 75 6c   LPDIRENT *resul
8150: 74 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 5f 66  t.){.  struct _f
8160: 69 6e 64 64 61 74 61 5f 74 20 64 61 74 61 3b 0a  inddata_t data;.
8170: 0a 20 20 69 66 28 20 64 69 72 70 3d 3d 4e 55 4c  .  if( dirp==NUL
8180: 4c 20 29 20 72 65 74 75 72 6e 20 45 42 41 44 46  L ) return EBADF
8190: 3b 0a 0a 20 20 69 66 28 20 64 69 72 70 2d 3e 64  ;..  if( dirp->d
81a0: 5f 66 69 72 73 74 2e 64 5f 69 6e 6f 3d 3d 30 20  _first.d_ino==0 
81b0: 29 7b 0a 20 20 20 20 64 69 72 70 2d 3e 64 5f 66  ){.    dirp->d_f
81c0: 69 72 73 74 2e 64 5f 69 6e 6f 2b 2b 3b 0a 20 20  irst.d_ino++;.  
81d0: 20 20 64 69 72 70 2d 3e 64 5f 6e 65 78 74 2e 64    dirp->d_next.d
81e0: 5f 69 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 65 6e 74  _ino++;..    ent
81f0: 72 79 2d 3e 64 5f 69 6e 6f 20 3d 20 64 69 72 70  ry->d_ino = dirp
8200: 2d 3e 64 5f 66 69 72 73 74 2e 64 5f 69 6e 6f 3b  ->d_first.d_ino;
8210: 0a 20 20 20 20 65 6e 74 72 79 2d 3e 64 5f 61 74  .    entry->d_at
8220: 74 72 69 62 75 74 65 73 20 3d 20 64 69 72 70 2d  tributes = dirp-
8230: 3e 64 5f 66 69 72 73 74 2e 64 5f 61 74 74 72 69  >d_first.d_attri
8240: 62 75 74 65 73 3b 0a 20 20 20 20 73 74 72 6e 63  butes;.    strnc
8250: 70 79 28 65 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65  py(entry->d_name
8260: 2c 20 64 69 72 70 2d 3e 64 5f 66 69 72 73 74 2e  , dirp->d_first.
8270: 64 5f 6e 61 6d 65 2c 20 4e 41 4d 45 5f 4d 41 58  d_name, NAME_MAX
8280: 29 3b 0a 20 20 20 20 65 6e 74 72 79 2d 3e 64 5f  );.    entry->d_
8290: 6e 61 6d 65 5b 4e 41 4d 45 5f 4d 41 58 5d 20 3d  name[NAME_MAX] =
82a0: 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2a 72 65 73   '\0';..    *res
82b0: 75 6c 74 20 3d 20 65 6e 74 72 79 3b 0a 20 20 20  ult = entry;.   
82c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
82d0: 6e 65 78 74 3a 0a 0a 20 20 6d 65 6d 73 65 74 28  next:..  memset(
82e0: 26 64 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  &data, 0, sizeof
82f0: 28 73 74 72 75 63 74 20 5f 66 69 6e 64 64 61 74  (struct _finddat
8300: 61 5f 74 29 29 3b 0a 20 20 69 66 28 20 5f 66 69  a_t));.  if( _fi
8310: 6e 64 6e 65 78 74 28 64 69 72 70 2d 3e 64 5f 68  ndnext(dirp->d_h
8320: 61 6e 64 6c 65 2c 20 26 64 61 74 61 29 3d 3d 2d  andle, &data)==-
8330: 31 20 29 7b 0a 20 20 20 20 2a 72 65 73 75 6c 74  1 ){.    *result
8340: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74   = NULL;.    ret
8350: 75 72 6e 20 45 4e 4f 45 4e 54 3b 0a 20 20 7d 0a  urn ENOENT;.  }.
8360: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 52 65 6d 6f  .  /* TODO: Remo
8370: 76 65 20 74 68 69 73 20 62 6c 6f 63 6b 20 74 6f  ve this block to
8380: 20 61 6c 6c 6f 77 20 68 69 64 64 65 6e 20 61 6e   allow hidden an
8390: 64 2f 6f 72 20 73 79 73 74 65 6d 20 66 69 6c 65  d/or system file
83a0: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 73 5f 66  s. */.  if( is_f
83b0: 69 6c 74 65 72 65 64 28 64 61 74 61 29 20 29 20  iltered(data) ) 
83c0: 67 6f 74 6f 20 6e 65 78 74 3b 0a 0a 20 20 65 6e  goto next;..  en
83d0: 74 72 79 2d 3e 64 5f 69 6e 6f 20 3d 20 28 69 6e  try->d_ino = (in
83e0: 6f 5f 74 29 2d 31 3b 20 2f 2a 20 6e 6f 74 20 61  o_t)-1; /* not a
83f0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 65 6e  vailable */.  en
8400: 74 72 79 2d 3e 64 5f 61 74 74 72 69 62 75 74 65  try->d_attribute
8410: 73 20 3d 20 64 61 74 61 2e 61 74 74 72 69 62 3b  s = data.attrib;
8420: 0a 20 20 73 74 72 6e 63 70 79 28 65 6e 74 72 79  .  strncpy(entry
8430: 2d 3e 64 5f 6e 61 6d 65 2c 20 64 61 74 61 2e 6e  ->d_name, data.n
8440: 61 6d 65 2c 20 4e 41 4d 45 5f 4d 41 58 29 3b 0a  ame, NAME_MAX);.
8450: 20 20 65 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 5b    entry->d_name[
8460: 4e 41 4d 45 5f 4d 41 58 5d 20 3d 20 27 5c 30 27  NAME_MAX] = '\0'
8470: 3b 0a 0a 20 20 2a 72 65 73 75 6c 74 20 3d 20 65  ;..  *result = e
8480: 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 30  ntry;.  return 0
8490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
84a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
84b0: 20 50 4f 53 49 58 20 63 6c 6f 73 65 64 69 72 28   POSIX closedir(
84c0: 29 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67  ) function using
84d0: 20 74 68 65 20 4d 53 56 43 52 54 2e 0a 2a 2f 0a   the MSVCRT..*/.
84e0: 49 4e 54 20 63 6c 6f 73 65 64 69 72 28 0a 20 20  INT closedir(.  
84f0: 4c 50 44 49 52 20 64 69 72 70 0a 29 7b 0a 20 20  LPDIR dirp.){.  
8500: 49 4e 54 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a  INT result = 0;.
8510: 0a 20 20 69 66 28 20 64 69 72 70 3d 3d 4e 55 4c  .  if( dirp==NUL
8520: 4c 20 29 20 72 65 74 75 72 6e 20 45 49 4e 56 41  L ) return EINVA
8530: 4c 3b 0a 0a 20 20 69 66 28 20 64 69 72 70 2d 3e  L;..  if( dirp->
8540: 64 5f 68 61 6e 64 6c 65 21 3d 4e 55 4c 4c 5f 49  d_handle!=NULL_I
8550: 4e 54 50 54 52 5f 54 20 26 26 20 64 69 72 70 2d  NTPTR_T && dirp-
8560: 3e 64 5f 68 61 6e 64 6c 65 21 3d 42 41 44 5f 49  >d_handle!=BAD_I
8570: 4e 54 50 54 52 5f 54 20 29 7b 0a 20 20 20 20 72  NTPTR_T ){.    r
8580: 65 73 75 6c 74 20 3d 20 5f 66 69 6e 64 63 6c 6f  esult = _findclo
8590: 73 65 28 64 69 72 70 2d 3e 64 5f 68 61 6e 64 6c  se(dirp->d_handl
85a0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  e);.  }..  sqlit
85b0: 65 33 5f 66 72 65 65 28 64 69 72 70 29 3b 0a 20  e3_free(dirp);. 
85c0: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
85d0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
85e0: 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20 64  ined(WIN32) && d
85f0: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
8600: 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
8610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
8620: 45 6e 64 20 74 65 73 74 5f 77 69 6e 64 69 72 65  End test_windire
8630: 6e 74 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt.c ***********
8640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 64 65 66 69  *********/.#defi
8650: 6e 65 20 64 69 72 65 6e 74 20 44 49 52 45 4e 54  ne dirent DIRENT
8660: 0a 23 65 6e 64 69 66 0a 2f 2a 2a 2a 2a 2a 2a 2a  .#endif./*******
8670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8680: 2a 2a 20 42 65 67 69 6e 20 2e 2e 2f 65 78 74 2f  ** Begin ../ext/
8690: 6d 69 73 63 2f 73 68 61 74 68 72 65 65 2e 63 20  misc/shathree.c 
86a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
86b0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 32 30 31 37 2d 30  **/./*.** 2017-0
86c0: 33 2d 30 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  3-08.**.** The a
86d0: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
86e0: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
86f0: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
8700: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
8710: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
8720: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
8730: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
8740: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
8750: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
8760: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
8770: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
8780: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
8790: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
87a0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
87b0: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
87c0: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
87d0: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
87e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8820: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
8830: 68 69 73 20 53 51 4c 69 74 65 20 65 78 74 65 6e  his SQLite exten
8840: 73 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20  sion implements 
8850: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 63  functions that c
8860: 6f 6d 70 75 74 65 20 53 48 41 33 20 68 61 73 68  ompute SHA3 hash
8870: 65 73 2e 0a 2a 2a 20 54 77 6f 20 53 51 4c 20 66  es..** Two SQL f
8880: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 69 6d 70  unctions are imp
8890: 6c 65 6d 65 6e 74 65 64 3a 0a 2a 2a 0a 2a 2a 20  lemented:.**.** 
88a0: 20 20 20 20 73 68 61 33 28 58 2c 53 49 5a 45 29      sha3(X,SIZE)
88b0: 0a 2a 2a 20 20 20 20 20 73 68 61 33 5f 71 75 65  .**     sha3_que
88c0: 72 79 28 59 2c 53 49 5a 45 29 0a 2a 2a 0a 2a 2a  ry(Y,SIZE).**.**
88d0: 20 54 68 65 20 73 68 61 33 28 58 29 20 66 75 6e   The sha3(X) fun
88e0: 63 74 69 6f 6e 20 63 6f 6d 70 75 74 65 73 20 74  ction computes t
88f0: 68 65 20 53 48 41 33 20 68 61 73 68 20 6f 66 20  he SHA3 hash of 
8900: 74 68 65 20 69 6e 70 75 74 20 58 2c 20 6f 72 20  the input X, or 
8910: 4e 55 4c 4c 20 69 66 0a 2a 2a 20 58 20 69 73 20  NULL if.** X is 
8920: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
8930: 73 68 61 33 5f 71 75 65 72 79 28 59 29 20 66 75  sha3_query(Y) fu
8940: 6e 63 74 69 6f 6e 20 65 76 61 6c 75 74 65 73 20  nction evalutes 
8950: 61 6c 6c 20 71 75 65 72 69 65 73 20 69 6e 20 74  all queries in t
8960: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
8970: 73 20 6f 66 20 59 0a 2a 2a 20 61 6e 64 20 72 65  s of Y.** and re
8980: 74 75 72 6e 73 20 61 20 68 61 73 68 20 6f 66 20  turns a hash of 
8990: 74 68 65 69 72 20 72 65 73 75 6c 74 73 2e 0a 2a  their results..*
89a0: 2a 0a 2a 2a 20 54 68 65 20 53 49 5a 45 20 61 72  *.** The SIZE ar
89b0: 67 75 6d 65 6e 74 20 69 73 20 6f 70 74 69 6f 6e  gument is option
89c0: 61 6c 2e 20 20 49 66 20 6f 6d 69 74 74 65 64 2c  al.  If omitted,
89d0: 20 74 68 65 20 53 48 41 33 2d 32 35 36 20 68 61   the SHA3-256 ha
89e0: 73 68 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  sh algorithm.** 
89f0: 69 73 20 75 73 65 64 2e 20 20 49 66 20 53 49 5a  is used.  If SIZ
8a00: 45 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 74  E is included it
8a10: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
8a20: 74 68 65 20 69 6e 74 65 67 65 72 73 20 32 32 34  the integers 224
8a30: 2c 20 32 35 36 2c 0a 2a 2a 20 33 38 34 2c 20 6f  , 256,.** 384, o
8a40: 72 20 35 31 32 2c 20 74 6f 20 64 65 74 65 72 6d  r 512, to determ
8a50: 69 6e 65 20 53 48 41 33 20 68 61 73 68 20 76 61  ine SHA3 hash va
8a60: 72 69 61 6e 74 20 74 68 61 74 20 69 73 20 63 6f  riant that is co
8a70: 6d 70 75 74 65 64 2e 0a 2a 2f 0a 53 51 4c 49 54  mputed..*/.SQLIT
8a80: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
8a90: 31 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  1.#include <asse
8aa0: 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rt.h>.#include <
8ab0: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
8ac0: 64 65 20 3c 73 74 64 61 72 67 2e 68 3e 0a 2f 2a  de <stdarg.h>./*
8ad0: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
8ae0: 5f 75 69 6e 74 36 34 20 75 36 34 3b 20 2a 2f 0a  _uint64 u64; */.
8af0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
8b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8b40: 0a 2a 2a 20 54 68 65 20 48 61 73 68 20 45 6e 67  .** The Hash Eng
8b50: 69 6e 65 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 63  ine.*/./*.** Mac
8b60: 72 6f 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ros to determine
8b70: 20 77 68 65 74 68 65 72 20 74 68 65 20 6d 61 63   whether the mac
8b80: 68 69 6e 65 20 69 73 20 62 69 67 20 6f 72 20 6c  hine is big or l
8b90: 69 74 74 6c 65 20 65 6e 64 69 61 6e 2c 0a 2a 2a  ittle endian,.**
8ba0: 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20   and whether or 
8bb0: 6e 6f 74 20 74 68 61 74 20 64 65 74 65 72 6d 69  not that determi
8bc0: 6e 61 74 69 6f 6e 20 69 73 20 72 75 6e 2d 74 69  nation is run-ti
8bd0: 6d 65 20 6f 72 20 63 6f 6d 70 69 6c 65 2d 74 69  me or compile-ti
8be0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 62 65  me..**.** For be
8bf0: 73 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  st performance, 
8c00: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
8c10: 64 65 20 74 6f 20 67 75 65 73 73 20 61 74 20 74  de to guess at t
8c20: 68 65 20 62 79 74 65 2d 6f 72 64 65 72 0a 2a 2a  he byte-order.**
8c30: 20 75 73 69 6e 67 20 43 2d 70 72 65 70 72 6f 63   using C-preproc
8c40: 65 73 73 6f 72 20 6d 61 63 72 6f 73 2e 20 20 49  essor macros.  I
8c50: 66 20 74 68 61 74 20 69 73 20 75 6e 73 75 63 63  f that is unsucc
8c60: 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 0a 2a 2a  essful, or if.**
8c70: 20 2d 44 53 48 41 33 5f 42 59 54 45 4f 52 44 45   -DSHA3_BYTEORDE
8c80: 52 3d 30 20 69 73 20 73 65 74 2c 20 74 68 65 6e  R=0 is set, then
8c90: 20 62 79 74 65 2d 6f 72 64 65 72 20 69 73 20 64   byte-order is d
8ca0: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 61 74 20  etermined.** at 
8cb0: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2f 0a 23 69 66  run-time..*/.#if
8cc0: 6e 64 65 66 20 53 48 41 33 5f 42 59 54 45 4f 52  ndef SHA3_BYTEOR
8cd0: 44 45 52 0a 23 20 69 66 20 64 65 66 69 6e 65 64  DER.# if defined
8ce0: 28 69 33 38 36 29 20 20 20 20 20 7c 7c 20 64 65  (i386)     || de
8cf0: 66 69 6e 65 64 28 5f 5f 69 33 38 36 5f 5f 29 20  fined(__i386__) 
8d00: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f    || defined(_M_
8d10: 49 58 38 36 29 20 7c 7c 20 20 20 20 5c 0a 20 20  IX86) ||    \.  
8d20: 20 20 20 64 65 66 69 6e 65 64 28 5f 5f 78 38 36     defined(__x86
8d30: 5f 36 34 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  _64) || defined(
8d40: 5f 5f 78 38 36 5f 36 34 5f 5f 29 20 7c 7c 20 64  __x86_64__) || d
8d50: 65 66 69 6e 65 64 28 5f 4d 5f 58 36 34 29 20 20  efined(_M_X64)  
8d60: 7c 7c 20 20 20 20 5c 0a 20 20 20 20 20 64 65 66  ||    \.     def
8d70: 69 6e 65 64 28 5f 4d 5f 41 4d 44 36 34 29 20 7c  ined(_M_AMD64) |
8d80: 7c 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  | defined(_M_ARM
8d90: 29 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  )     || defined
8da0: 28 5f 5f 78 38 36 29 20 20 20 7c 7c 20 20 20 20  (__x86)   ||    
8db0: 5c 0a 20 20 20 20 20 64 65 66 69 6e 65 64 28 5f  \.     defined(_
8dc0: 5f 61 72 6d 5f 5f 29 0a 23 20 20 20 64 65 66 69  _arm__).#   defi
8dd0: 6e 65 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45  ne SHA3_BYTEORDE
8de0: 52 20 20 20 20 31 32 33 34 0a 23 20 65 6c 69 66  R    1234.# elif
8df0: 20 64 65 66 69 6e 65 64 28 73 70 61 72 63 29 20   defined(sparc) 
8e00: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f     || defined(__
8e10: 70 70 63 5f 5f 29 0a 23 20 20 20 64 65 66 69 6e  ppc__).#   defin
8e20: 65 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52  e SHA3_BYTEORDER
8e30: 20 20 20 20 34 33 32 31 0a 23 20 65 6c 73 65 0a      4321.# else.
8e40: 23 20 20 20 64 65 66 69 6e 65 20 53 48 41 33 5f  #   define SHA3_
8e50: 42 59 54 45 4f 52 44 45 52 20 30 0a 23 20 65 6e  BYTEORDER 0.# en
8e60: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  dif.#endif.../*.
8e70: 2a 2a 20 53 74 61 74 65 20 73 74 72 75 63 74 75  ** State structu
8e80: 72 65 20 66 6f 72 20 61 20 53 48 41 33 20 68 61  re for a SHA3 ha
8e90: 73 68 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 2a  sh in progress.*
8ea0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
8eb0: 20 53 48 41 33 43 6f 6e 74 65 78 74 20 53 48 41   SHA3Context SHA
8ec0: 33 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  3Context;.struct
8ed0: 20 53 48 41 33 43 6f 6e 74 65 78 74 20 7b 0a 20   SHA3Context {. 
8ee0: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
8ef0: 20 73 5b 32 35 5d 3b 20 20 20 20 20 20 20 20 20   s[25];         
8f00: 20 20 20 20 20 20 20 2f 2a 20 4b 65 63 63 61 6b         /* Keccak
8f10: 20 73 74 61 74 65 2e 20 35 78 35 20 6c 69 6e 65   state. 5x5 line
8f20: 73 20 6f 66 20 36 34 20 62 69 74 73 20 65 61 63  s of 64 bits eac
8f30: 68 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  h */.    unsigne
8f40: 64 20 63 68 61 72 20 78 5b 31 36 30 30 5d 3b 20  d char x[1600]; 
8f50: 20 20 20 2f 2a 20 2e 2e 2e 20 6f 72 20 31 36 30     /* ... or 160
8f60: 30 20 62 79 74 65 73 20 2a 2f 0a 20 20 7d 20 75  0 bytes */.  } u
8f70: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6e 52 61  ;.  unsigned nRa
8f80: 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 79  te;        /* By
8f90: 74 65 73 20 6f 66 20 69 6e 70 75 74 20 61 63 63  tes of input acc
8fa0: 65 70 74 65 64 20 70 65 72 20 4b 65 63 63 61 6b  epted per Keccak
8fb0: 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
8fc0: 75 6e 73 69 67 6e 65 64 20 6e 4c 6f 61 64 65 64  unsigned nLoaded
8fd0: 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
8fe0: 62 79 74 65 73 20 6c 6f 61 64 65 64 20 69 6e 74  bytes loaded int
8ff0: 6f 20 75 2e 78 5b 5d 20 73 6f 20 66 61 72 20 74  o u.x[] so far t
9000: 68 69 73 20 63 79 63 6c 65 20 2a 2f 0a 20 20 75  his cycle */.  u
9010: 6e 73 69 67 6e 65 64 20 69 78 4d 61 73 6b 3b 20  nsigned ixMask; 
9020: 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
9030: 6e 65 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20  next input into 
9040: 75 2e 78 5b 6e 4c 6f 61 64 65 64 5e 69 78 4d 61  u.x[nLoaded^ixMa
9050: 73 6b 5d 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sk]. */.};../*.*
9060: 2a 20 41 20 73 69 6e 67 6c 65 20 73 74 65 70 20  * A single step 
9070: 6f 66 20 74 68 65 20 4b 65 63 63 61 6b 20 6d 69  of the Keccak mi
9080: 78 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  xing function fo
9090: 72 20 61 20 31 36 30 30 2d 62 69 74 20 73 74 61  r a 1600-bit sta
90a0: 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  te.*/.static voi
90b0: 64 20 4b 65 63 63 61 6b 46 31 36 30 30 53 74 65  d KeccakF1600Ste
90c0: 70 28 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70  p(SHA3Context *p
90d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36  ){.  int i;.  u6
90e0: 34 20 62 30 2c 20 62 31 2c 20 62 32 2c 20 62 33  4 b0, b1, b2, b3
90f0: 2c 20 62 34 3b 0a 20 20 75 36 34 20 63 30 2c 20  , b4;.  u64 c0, 
9100: 63 31 2c 20 63 32 2c 20 63 33 2c 20 63 34 3b 0a  c1, c2, c3, c4;.
9110: 20 20 75 36 34 20 64 30 2c 20 64 31 2c 20 64 32    u64 d0, d1, d2
9120: 2c 20 64 33 2c 20 64 34 3b 0a 20 20 73 74 61 74  , d3, d4;.  stat
9130: 69 63 20 63 6f 6e 73 74 20 75 36 34 20 52 43 5b  ic const u64 RC[
9140: 5d 20 3d 20 7b 0a 20 20 20 20 30 78 30 30 30 30  ] = {.    0x0000
9150: 30 30 30 30 30 30 30 30 30 30 30 31 55 4c 4c 2c  000000000001ULL,
9160: 20 20 30 78 30 30 30 30 30 30 30 30 30 30 30 30    0x000000000000
9170: 38 30 38 32 55 4c 4c 2c 0a 20 20 20 20 30 78 38  8082ULL,.    0x8
9180: 30 30 30 30 30 30 30 30 30 30 30 38 30 38 61 55  00000000000808aU
9190: 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30 38  LL,  0x800000008
91a0: 30 30 30 38 30 30 30 55 4c 4c 2c 0a 20 20 20 20  0008000ULL,.    
91b0: 30 78 30 30 30 30 30 30 30 30 30 30 30 30 38 30  0x00000000000080
91c0: 38 62 55 4c 4c 2c 20 20 30 78 30 30 30 30 30 30  8bULL,  0x000000
91d0: 30 30 38 30 30 30 30 30 30 31 55 4c 4c 2c 0a 20  0080000001ULL,. 
91e0: 20 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30     0x80000000800
91f0: 30 38 30 38 31 55 4c 4c 2c 20 20 30 78 38 30 30  08081ULL,  0x800
9200: 30 30 30 30 30 30 30 30 30 38 30 30 39 55 4c 4c  0000000008009ULL
9210: 2c 0a 20 20 20 20 30 78 30 30 30 30 30 30 30 30  ,.    0x00000000
9220: 30 30 30 30 30 30 38 61 55 4c 4c 2c 20 20 30 78  0000008aULL,  0x
9230: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 38  0000000000000088
9240: 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30 30 30  ULL,.    0x00000
9250: 30 30 30 38 30 30 30 38 30 30 39 55 4c 4c 2c 20  00080008009ULL, 
9260: 20 30 78 30 30 30 30 30 30 30 30 38 30 30 30 30   0x0000000080000
9270: 30 30 61 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30  00aULL,.    0x00
9280: 30 30 30 30 30 30 38 30 30 30 38 30 38 62 55 4c  0000008000808bUL
9290: 4c 2c 20 20 30 78 38 30 30 30 30 30 30 30 30 30  L,  0x8000000000
92a0: 30 30 30 30 38 62 55 4c 4c 2c 0a 20 20 20 20 30  00008bULL,.    0
92b0: 78 38 30 30 30 30 30 30 30 30 30 30 30 38 30 38  x800000000000808
92c0: 39 55 4c 4c 2c 20 20 30 78 38 30 30 30 30 30 30  9ULL,  0x8000000
92d0: 30 30 30 30 30 38 30 30 33 55 4c 4c 2c 0a 20 20  000008003ULL,.  
92e0: 20 20 30 78 38 30 30 30 30 30 30 30 30 30 30 30    0x800000000000
92f0: 38 30 30 32 55 4c 4c 2c 20 20 30 78 38 30 30 30  8002ULL,  0x8000
9300: 30 30 30 30 30 30 30 30 30 30 38 30 55 4c 4c 2c  000000000080ULL,
9310: 0a 20 20 20 20 30 78 30 30 30 30 30 30 30 30 30  .    0x000000000
9320: 30 30 30 38 30 30 61 55 4c 4c 2c 20 20 30 78 38  000800aULL,  0x8
9330: 30 30 30 30 30 30 30 38 30 30 30 30 30 30 61 55  00000008000000aU
9340: 4c 4c 2c 0a 20 20 20 20 30 78 38 30 30 30 30 30  LL,.    0x800000
9350: 30 30 38 30 30 30 38 30 38 31 55 4c 4c 2c 20 20  0080008081ULL,  
9360: 30 78 38 30 30 30 30 30 30 30 30 30 30 30 38 30  0x80000000000080
9370: 38 30 55 4c 4c 2c 0a 20 20 20 20 30 78 30 30 30  80ULL,.    0x000
9380: 30 30 30 30 30 38 30 30 30 30 30 30 31 55 4c 4c  0000080000001ULL
9390: 2c 20 20 30 78 38 30 30 30 30 30 30 30 38 30 30  ,  0x80000000800
93a0: 30 38 30 30 38 55 4c 4c 0a 20 20 7d 3b 0a 23 20  08008ULL.  };.# 
93b0: 64 65 66 69 6e 65 20 61 30 30 20 28 70 2d 3e 75  define a00 (p->u
93c0: 2e 73 5b 30 5d 29 0a 23 20 64 65 66 69 6e 65 20  .s[0]).# define 
93d0: 61 30 31 20 28 70 2d 3e 75 2e 73 5b 31 5d 29 0a  a01 (p->u.s[1]).
93e0: 23 20 64 65 66 69 6e 65 20 61 30 32 20 28 70 2d  # define a02 (p-
93f0: 3e 75 2e 73 5b 32 5d 29 0a 23 20 64 65 66 69 6e  >u.s[2]).# defin
9400: 65 20 61 30 33 20 28 70 2d 3e 75 2e 73 5b 33 5d  e a03 (p->u.s[3]
9410: 29 0a 23 20 64 65 66 69 6e 65 20 61 30 34 20 28  ).# define a04 (
9420: 70 2d 3e 75 2e 73 5b 34 5d 29 0a 23 20 64 65 66  p->u.s[4]).# def
9430: 69 6e 65 20 61 31 30 20 28 70 2d 3e 75 2e 73 5b  ine a10 (p->u.s[
9440: 35 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 31 31  5]).# define a11
9450: 20 28 70 2d 3e 75 2e 73 5b 36 5d 29 0a 23 20 64   (p->u.s[6]).# d
9460: 65 66 69 6e 65 20 61 31 32 20 28 70 2d 3e 75 2e  efine a12 (p->u.
9470: 73 5b 37 5d 29 0a 23 20 64 65 66 69 6e 65 20 61  s[7]).# define a
9480: 31 33 20 28 70 2d 3e 75 2e 73 5b 38 5d 29 0a 23  13 (p->u.s[8]).#
9490: 20 64 65 66 69 6e 65 20 61 31 34 20 28 70 2d 3e   define a14 (p->
94a0: 75 2e 73 5b 39 5d 29 0a 23 20 64 65 66 69 6e 65  u.s[9]).# define
94b0: 20 61 32 30 20 28 70 2d 3e 75 2e 73 5b 31 30 5d   a20 (p->u.s[10]
94c0: 29 0a 23 20 64 65 66 69 6e 65 20 61 32 31 20 28  ).# define a21 (
94d0: 70 2d 3e 75 2e 73 5b 31 31 5d 29 0a 23 20 64 65  p->u.s[11]).# de
94e0: 66 69 6e 65 20 61 32 32 20 28 70 2d 3e 75 2e 73  fine a22 (p->u.s
94f0: 5b 31 32 5d 29 0a 23 20 64 65 66 69 6e 65 20 61  [12]).# define a
9500: 32 33 20 28 70 2d 3e 75 2e 73 5b 31 33 5d 29 0a  23 (p->u.s[13]).
9510: 23 20 64 65 66 69 6e 65 20 61 32 34 20 28 70 2d  # define a24 (p-
9520: 3e 75 2e 73 5b 31 34 5d 29 0a 23 20 64 65 66 69  >u.s[14]).# defi
9530: 6e 65 20 61 33 30 20 28 70 2d 3e 75 2e 73 5b 31  ne a30 (p->u.s[1
9540: 35 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 33 31  5]).# define a31
9550: 20 28 70 2d 3e 75 2e 73 5b 31 36 5d 29 0a 23 20   (p->u.s[16]).# 
9560: 64 65 66 69 6e 65 20 61 33 32 20 28 70 2d 3e 75  define a32 (p->u
9570: 2e 73 5b 31 37 5d 29 0a 23 20 64 65 66 69 6e 65  .s[17]).# define
9580: 20 61 33 33 20 28 70 2d 3e 75 2e 73 5b 31 38 5d   a33 (p->u.s[18]
9590: 29 0a 23 20 64 65 66 69 6e 65 20 61 33 34 20 28  ).# define a34 (
95a0: 70 2d 3e 75 2e 73 5b 31 39 5d 29 0a 23 20 64 65  p->u.s[19]).# de
95b0: 66 69 6e 65 20 61 34 30 20 28 70 2d 3e 75 2e 73  fine a40 (p->u.s
95c0: 5b 32 30 5d 29 0a 23 20 64 65 66 69 6e 65 20 61  [20]).# define a
95d0: 34 31 20 28 70 2d 3e 75 2e 73 5b 32 31 5d 29 0a  41 (p->u.s[21]).
95e0: 23 20 64 65 66 69 6e 65 20 61 34 32 20 28 70 2d  # define a42 (p-
95f0: 3e 75 2e 73 5b 32 32 5d 29 0a 23 20 64 65 66 69  >u.s[22]).# defi
9600: 6e 65 20 61 34 33 20 28 70 2d 3e 75 2e 73 5b 32  ne a43 (p->u.s[2
9610: 33 5d 29 0a 23 20 64 65 66 69 6e 65 20 61 34 34  3]).# define a44
9620: 20 28 70 2d 3e 75 2e 73 5b 32 34 5d 29 0a 23 20   (p->u.s[24]).# 
9630: 64 65 66 69 6e 65 20 52 4f 4c 36 34 28 61 2c 78  define ROL64(a,x
9640: 29 20 28 28 61 3c 3c 78 29 7c 28 61 3e 3e 28 36  ) ((a<<x)|(a>>(6
9650: 34 2d 78 29 29 29 0a 0a 20 20 66 6f 72 28 69 3d  4-x)))..  for(i=
9660: 30 3b 20 69 3c 32 34 3b 20 69 2b 3d 34 29 7b 0a  0; i<24; i+=4){.
9670: 20 20 20 20 63 30 20 3d 20 61 30 30 5e 61 31 30      c0 = a00^a10
9680: 5e 61 32 30 5e 61 33 30 5e 61 34 30 3b 0a 20 20  ^a20^a30^a40;.  
9690: 20 20 63 31 20 3d 20 61 30 31 5e 61 31 31 5e 61    c1 = a01^a11^a
96a0: 32 31 5e 61 33 31 5e 61 34 31 3b 0a 20 20 20 20  21^a31^a41;.    
96b0: 63 32 20 3d 20 61 30 32 5e 61 31 32 5e 61 32 32  c2 = a02^a12^a22
96c0: 5e 61 33 32 5e 61 34 32 3b 0a 20 20 20 20 63 33  ^a32^a42;.    c3
96d0: 20 3d 20 61 30 33 5e 61 31 33 5e 61 32 33 5e 61   = a03^a13^a23^a
96e0: 33 33 5e 61 34 33 3b 0a 20 20 20 20 63 34 20 3d  33^a43;.    c4 =
96f0: 20 61 30 34 5e 61 31 34 5e 61 32 34 5e 61 33 34   a04^a14^a24^a34
9700: 5e 61 34 34 3b 0a 20 20 20 20 64 30 20 3d 20 63  ^a44;.    d0 = c
9710: 34 5e 52 4f 4c 36 34 28 63 31 2c 20 31 29 3b 0a  4^ROL64(c1, 1);.
9720: 20 20 20 20 64 31 20 3d 20 63 30 5e 52 4f 4c 36      d1 = c0^ROL6
9730: 34 28 63 32 2c 20 31 29 3b 0a 20 20 20 20 64 32  4(c2, 1);.    d2
9740: 20 3d 20 63 31 5e 52 4f 4c 36 34 28 63 33 2c 20   = c1^ROL64(c3, 
9750: 31 29 3b 0a 20 20 20 20 64 33 20 3d 20 63 32 5e  1);.    d3 = c2^
9760: 52 4f 4c 36 34 28 63 34 2c 20 31 29 3b 0a 20 20  ROL64(c4, 1);.  
9770: 20 20 64 34 20 3d 20 63 33 5e 52 4f 4c 36 34 28    d4 = c3^ROL64(
9780: 63 30 2c 20 31 29 3b 0a 0a 20 20 20 20 62 30 20  c0, 1);..    b0 
9790: 3d 20 28 61 30 30 5e 64 30 29 3b 0a 20 20 20 20  = (a00^d0);.    
97a0: 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 31 5e  b1 = ROL64((a11^
97b0: 64 31 29 2c 20 34 34 29 3b 0a 20 20 20 20 62 32  d1), 44);.    b2
97c0: 20 3d 20 52 4f 4c 36 34 28 28 61 32 32 5e 64 32   = ROL64((a22^d2
97d0: 29 2c 20 34 33 29 3b 0a 20 20 20 20 62 33 20 3d  ), 43);.    b3 =
97e0: 20 52 4f 4c 36 34 28 28 61 33 33 5e 64 33 29 2c   ROL64((a33^d3),
97f0: 20 32 31 29 3b 0a 20 20 20 20 62 34 20 3d 20 52   21);.    b4 = R
9800: 4f 4c 36 34 28 28 61 34 34 5e 64 34 29 2c 20 31  OL64((a44^d4), 1
9810: 34 29 3b 0a 20 20 20 20 61 30 30 20 3d 20 20 20  4);.    a00 =   
9820: 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20  b0 ^((~b1)&  b2 
9830: 29 3b 0a 20 20 20 20 61 30 30 20 5e 3d 20 52 43  );.    a00 ^= RC
9840: 5b 69 5d 3b 0a 20 20 20 20 61 31 31 20 3d 20 20  [i];.    a11 =  
9850: 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33   b1 ^((~b2)&  b3
9860: 20 29 3b 0a 20 20 20 20 61 32 32 20 3d 20 20 20   );.    a22 =   
9870: 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20  b2 ^((~b3)&  b4 
9880: 29 3b 0a 20 20 20 20 61 33 33 20 3d 20 20 20 62  );.    a33 =   b
9890: 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29  3 ^((~b4)&  b0 )
98a0: 3b 0a 20 20 20 20 61 34 34 20 3d 20 20 20 62 34  ;.    a44 =   b4
98b0: 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b   ^((~b0)&  b1 );
98c0: 0a 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34  ..    b2 = ROL64
98d0: 28 28 61 32 30 5e 64 30 29 2c 20 33 29 3b 0a 20  ((a20^d0), 3);. 
98e0: 20 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61     b3 = ROL64((a
98f0: 33 31 5e 64 31 29 2c 20 34 35 29 3b 0a 20 20 20  31^d1), 45);.   
9900: 20 62 34 20 3d 20 52 4f 4c 36 34 28 28 61 34 32   b4 = ROL64((a42
9910: 5e 64 32 29 2c 20 36 31 29 3b 0a 20 20 20 20 62  ^d2), 61);.    b
9920: 30 20 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64  0 = ROL64((a03^d
9930: 33 29 2c 20 32 38 29 3b 0a 20 20 20 20 62 31 20  3), 28);.    b1 
9940: 3d 20 52 4f 4c 36 34 28 28 61 31 34 5e 64 34 29  = ROL64((a14^d4)
9950: 2c 20 32 30 29 3b 0a 20 20 20 20 61 32 30 20 3d  , 20);.    a20 =
9960: 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20     b0 ^((~b1)&  
9970: 62 32 20 29 3b 0a 20 20 20 20 61 33 31 20 3d 20  b2 );.    a31 = 
9980: 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62    b1 ^((~b2)&  b
9990: 33 20 29 3b 0a 20 20 20 20 61 34 32 20 3d 20 20  3 );.    a42 =  
99a0: 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34   b2 ^((~b3)&  b4
99b0: 20 29 3b 0a 20 20 20 20 61 30 33 20 3d 20 20 20   );.    a03 =   
99c0: 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20  b3 ^((~b4)&  b0 
99d0: 29 3b 0a 20 20 20 20 61 31 34 20 3d 20 20 20 62  );.    a14 =   b
99e0: 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29  4 ^((~b0)&  b1 )
99f0: 3b 0a 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36  ;..    b4 = ROL6
9a00: 34 28 28 61 34 30 5e 64 30 29 2c 20 31 38 29 3b  4((a40^d0), 18);
9a10: 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28  .    b0 = ROL64(
9a20: 28 61 30 31 5e 64 31 29 2c 20 31 29 3b 0a 20 20  (a01^d1), 1);.  
9a30: 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31    b1 = ROL64((a1
9a40: 32 5e 64 32 29 2c 20 36 29 3b 0a 20 20 20 20 62  2^d2), 6);.    b
9a50: 32 20 3d 20 52 4f 4c 36 34 28 28 61 32 33 5e 64  2 = ROL64((a23^d
9a60: 33 29 2c 20 32 35 29 3b 0a 20 20 20 20 62 33 20  3), 25);.    b3 
9a70: 3d 20 52 4f 4c 36 34 28 28 61 33 34 5e 64 34 29  = ROL64((a34^d4)
9a80: 2c 20 38 29 3b 0a 20 20 20 20 61 34 30 20 3d 20  , 8);.    a40 = 
9a90: 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62    b0 ^((~b1)&  b
9aa0: 32 20 29 3b 0a 20 20 20 20 61 30 31 20 3d 20 20  2 );.    a01 =  
9ab0: 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33   b1 ^((~b2)&  b3
9ac0: 20 29 3b 0a 20 20 20 20 61 31 32 20 3d 20 20 20   );.    a12 =   
9ad0: 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20  b2 ^((~b3)&  b4 
9ae0: 29 3b 0a 20 20 20 20 61 32 33 20 3d 20 20 20 62  );.    a23 =   b
9af0: 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29  3 ^((~b4)&  b0 )
9b00: 3b 0a 20 20 20 20 61 33 34 20 3d 20 20 20 62 34  ;.    a34 =   b4
9b10: 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b   ^((~b0)&  b1 );
9b20: 0a 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34  ..    b1 = ROL64
9b30: 28 28 61 31 30 5e 64 30 29 2c 20 33 36 29 3b 0a  ((a10^d0), 36);.
9b40: 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28      b2 = ROL64((
9b50: 61 32 31 5e 64 31 29 2c 20 31 30 29 3b 0a 20 20  a21^d1), 10);.  
9b60: 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 33    b3 = ROL64((a3
9b70: 32 5e 64 32 29 2c 20 31 35 29 3b 0a 20 20 20 20  2^d2), 15);.    
9b80: 62 34 20 3d 20 52 4f 4c 36 34 28 28 61 34 33 5e  b4 = ROL64((a43^
9b90: 64 33 29 2c 20 35 36 29 3b 0a 20 20 20 20 62 30  d3), 56);.    b0
9ba0: 20 3d 20 52 4f 4c 36 34 28 28 61 30 34 5e 64 34   = ROL64((a04^d4
9bb0: 29 2c 20 32 37 29 3b 0a 20 20 20 20 61 31 30 20  ), 27);.    a10 
9bc0: 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20  =   b0 ^((~b1)& 
9bd0: 20 62 32 20 29 3b 0a 20 20 20 20 61 32 31 20 3d   b2 );.    a21 =
9be0: 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20     b1 ^((~b2)&  
9bf0: 62 33 20 29 3b 0a 20 20 20 20 61 33 32 20 3d 20  b3 );.    a32 = 
9c00: 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62    b2 ^((~b3)&  b
9c10: 34 20 29 3b 0a 20 20 20 20 61 34 33 20 3d 20 20  4 );.    a43 =  
9c20: 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30   b3 ^((~b4)&  b0
9c30: 20 29 3b 0a 20 20 20 20 61 30 34 20 3d 20 20 20   );.    a04 =   
9c40: 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20  b4 ^((~b0)&  b1 
9c50: 29 3b 0a 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c  );..    b3 = ROL
9c60: 36 34 28 28 61 33 30 5e 64 30 29 2c 20 34 31 29  64((a30^d0), 41)
9c70: 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34  ;.    b4 = ROL64
9c80: 28 28 61 34 31 5e 64 31 29 2c 20 32 29 3b 0a 20  ((a41^d1), 2);. 
9c90: 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61     b0 = ROL64((a
9ca0: 30 32 5e 64 32 29 2c 20 36 32 29 3b 0a 20 20 20  02^d2), 62);.   
9cb0: 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31 33   b1 = ROL64((a13
9cc0: 5e 64 33 29 2c 20 35 35 29 3b 0a 20 20 20 20 62  ^d3), 55);.    b
9cd0: 32 20 3d 20 52 4f 4c 36 34 28 28 61 32 34 5e 64  2 = ROL64((a24^d
9ce0: 34 29 2c 20 33 39 29 3b 0a 20 20 20 20 61 33 30  4), 39);.    a30
9cf0: 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26   =   b0 ^((~b1)&
9d00: 20 20 62 32 20 29 3b 0a 20 20 20 20 61 34 31 20    b2 );.    a41 
9d10: 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20  =   b1 ^((~b2)& 
9d20: 20 62 33 20 29 3b 0a 20 20 20 20 61 30 32 20 3d   b3 );.    a02 =
9d30: 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20     b2 ^((~b3)&  
9d40: 62 34 20 29 3b 0a 20 20 20 20 61 31 33 20 3d 20  b4 );.    a13 = 
9d50: 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62    b3 ^((~b4)&  b
9d60: 30 20 29 3b 0a 20 20 20 20 61 32 34 20 3d 20 20  0 );.    a24 =  
9d70: 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31   b4 ^((~b0)&  b1
9d80: 20 29 3b 0a 0a 20 20 20 20 63 30 20 3d 20 61 30   );..    c0 = a0
9d90: 30 5e 61 32 30 5e 61 34 30 5e 61 31 30 5e 61 33  0^a20^a40^a10^a3
9da0: 30 3b 0a 20 20 20 20 63 31 20 3d 20 61 31 31 5e  0;.    c1 = a11^
9db0: 61 33 31 5e 61 30 31 5e 61 32 31 5e 61 34 31 3b  a31^a01^a21^a41;
9dc0: 0a 20 20 20 20 63 32 20 3d 20 61 32 32 5e 61 34  .    c2 = a22^a4
9dd0: 32 5e 61 31 32 5e 61 33 32 5e 61 30 32 3b 0a 20  2^a12^a32^a02;. 
9de0: 20 20 20 63 33 20 3d 20 61 33 33 5e 61 30 33 5e     c3 = a33^a03^
9df0: 61 32 33 5e 61 34 33 5e 61 31 33 3b 0a 20 20 20  a23^a43^a13;.   
9e00: 20 63 34 20 3d 20 61 34 34 5e 61 31 34 5e 61 33   c4 = a44^a14^a3
9e10: 34 5e 61 30 34 5e 61 32 34 3b 0a 20 20 20 20 64  4^a04^a24;.    d
9e20: 30 20 3d 20 63 34 5e 52 4f 4c 36 34 28 63 31 2c  0 = c4^ROL64(c1,
9e30: 20 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 63 30   1);.    d1 = c0
9e40: 5e 52 4f 4c 36 34 28 63 32 2c 20 31 29 3b 0a 20  ^ROL64(c2, 1);. 
9e50: 20 20 20 64 32 20 3d 20 63 31 5e 52 4f 4c 36 34     d2 = c1^ROL64
9e60: 28 63 33 2c 20 31 29 3b 0a 20 20 20 20 64 33 20  (c3, 1);.    d3 
9e70: 3d 20 63 32 5e 52 4f 4c 36 34 28 63 34 2c 20 31  = c2^ROL64(c4, 1
9e80: 29 3b 0a 20 20 20 20 64 34 20 3d 20 63 33 5e 52  );.    d4 = c3^R
9e90: 4f 4c 36 34 28 63 30 2c 20 31 29 3b 0a 0a 20 20  OL64(c0, 1);..  
9ea0: 20 20 62 30 20 3d 20 28 61 30 30 5e 64 30 29 3b    b0 = (a00^d0);
9eb0: 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28  .    b1 = ROL64(
9ec0: 28 61 33 31 5e 64 31 29 2c 20 34 34 29 3b 0a 20  (a31^d1), 44);. 
9ed0: 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61     b2 = ROL64((a
9ee0: 31 32 5e 64 32 29 2c 20 34 33 29 3b 0a 20 20 20  12^d2), 43);.   
9ef0: 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 34 33   b3 = ROL64((a43
9f00: 5e 64 33 29 2c 20 32 31 29 3b 0a 20 20 20 20 62  ^d3), 21);.    b
9f10: 34 20 3d 20 52 4f 4c 36 34 28 28 61 32 34 5e 64  4 = ROL64((a24^d
9f20: 34 29 2c 20 31 34 29 3b 0a 20 20 20 20 61 30 30  4), 14);.    a00
9f30: 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26   =   b0 ^((~b1)&
9f40: 20 20 62 32 20 29 3b 0a 20 20 20 20 61 30 30 20    b2 );.    a00 
9f50: 5e 3d 20 52 43 5b 69 2b 31 5d 3b 0a 20 20 20 20  ^= RC[i+1];.    
9f60: 61 33 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62  a31 =   b1 ^((~b
9f70: 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61  2)&  b3 );.    a
9f80: 31 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33  12 =   b2 ^((~b3
9f90: 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 34  )&  b4 );.    a4
9fa0: 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29  3 =   b3 ^((~b4)
9fb0: 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 32 34  &  b0 );.    a24
9fc0: 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26   =   b4 ^((~b0)&
9fd0: 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 32 20    b1 );..    b2 
9fe0: 3d 20 52 4f 4c 36 34 28 28 61 34 30 5e 64 30 29  = ROL64((a40^d0)
9ff0: 2c 20 33 29 3b 0a 20 20 20 20 62 33 20 3d 20 52  , 3);.    b3 = R
a000: 4f 4c 36 34 28 28 61 32 31 5e 64 31 29 2c 20 34  OL64((a21^d1), 4
a010: 35 29 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c  5);.    b4 = ROL
a020: 36 34 28 28 61 30 32 5e 64 32 29 2c 20 36 31 29  64((a02^d2), 61)
a030: 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34  ;.    b0 = ROL64
a040: 28 28 61 33 33 5e 64 33 29 2c 20 32 38 29 3b 0a  ((a33^d3), 28);.
a050: 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28      b1 = ROL64((
a060: 61 31 34 5e 64 34 29 2c 20 32 30 29 3b 0a 20 20  a14^d4), 20);.  
a070: 20 20 61 34 30 20 3d 20 20 20 62 30 20 5e 28 28    a40 =   b0 ^((
a080: 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20  ~b1)&  b2 );.   
a090: 20 61 32 31 20 3d 20 20 20 62 31 20 5e 28 28 7e   a21 =   b1 ^((~
a0a0: 62 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20  b2)&  b3 );.    
a0b0: 61 30 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62  a02 =   b2 ^((~b
a0c0: 33 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61  3)&  b4 );.    a
a0d0: 33 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34  33 =   b3 ^((~b4
a0e0: 29 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 31  )&  b0 );.    a1
a0f0: 34 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29  4 =   b4 ^((~b0)
a100: 26 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 34  &  b1 );..    b4
a110: 20 3d 20 52 4f 4c 36 34 28 28 61 33 30 5e 64 30   = ROL64((a30^d0
a120: 29 2c 20 31 38 29 3b 0a 20 20 20 20 62 30 20 3d  ), 18);.    b0 =
a130: 20 52 4f 4c 36 34 28 28 61 31 31 5e 64 31 29 2c   ROL64((a11^d1),
a140: 20 31 29 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f   1);.    b1 = RO
a150: 4c 36 34 28 28 61 34 32 5e 64 32 29 2c 20 36 29  L64((a42^d2), 6)
a160: 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34  ;.    b2 = ROL64
a170: 28 28 61 32 33 5e 64 33 29 2c 20 32 35 29 3b 0a  ((a23^d3), 25);.
a180: 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28      b3 = ROL64((
a190: 61 30 34 5e 64 34 29 2c 20 38 29 3b 0a 20 20 20  a04^d4), 8);.   
a1a0: 20 61 33 30 20 3d 20 20 20 62 30 20 5e 28 28 7e   a30 =   b0 ^((~
a1b0: 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20  b1)&  b2 );.    
a1c0: 61 31 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62  a11 =   b1 ^((~b
a1d0: 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61  2)&  b3 );.    a
a1e0: 34 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33  42 =   b2 ^((~b3
a1f0: 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 32  )&  b4 );.    a2
a200: 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29  3 =   b3 ^((~b4)
a210: 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 30 34  &  b0 );.    a04
a220: 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26   =   b4 ^((~b0)&
a230: 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 31 20    b1 );..    b1 
a240: 3d 20 52 4f 4c 36 34 28 28 61 32 30 5e 64 30 29  = ROL64((a20^d0)
a250: 2c 20 33 36 29 3b 0a 20 20 20 20 62 32 20 3d 20  , 36);.    b2 = 
a260: 52 4f 4c 36 34 28 28 61 30 31 5e 64 31 29 2c 20  ROL64((a01^d1), 
a270: 31 30 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f  10);.    b3 = RO
a280: 4c 36 34 28 28 61 33 32 5e 64 32 29 2c 20 31 35  L64((a32^d2), 15
a290: 29 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36  );.    b4 = ROL6
a2a0: 34 28 28 61 31 33 5e 64 33 29 2c 20 35 36 29 3b  4((a13^d3), 56);
a2b0: 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28  .    b0 = ROL64(
a2c0: 28 61 34 34 5e 64 34 29 2c 20 32 37 29 3b 0a 20  (a44^d4), 27);. 
a2d0: 20 20 20 61 32 30 20 3d 20 20 20 62 30 20 5e 28     a20 =   b0 ^(
a2e0: 28 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20  (~b1)&  b2 );.  
a2f0: 20 20 61 30 31 20 3d 20 20 20 62 31 20 5e 28 28    a01 =   b1 ^((
a300: 7e 62 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20  ~b2)&  b3 );.   
a310: 20 61 33 32 20 3d 20 20 20 62 32 20 5e 28 28 7e   a32 =   b2 ^((~
a320: 62 33 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20  b3)&  b4 );.    
a330: 61 31 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62  a13 =   b3 ^((~b
a340: 34 29 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61  4)&  b0 );.    a
a350: 34 34 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30  44 =   b4 ^((~b0
a360: 29 26 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62  )&  b1 );..    b
a370: 33 20 3d 20 52 4f 4c 36 34 28 28 61 31 30 5e 64  3 = ROL64((a10^d
a380: 30 29 2c 20 34 31 29 3b 0a 20 20 20 20 62 34 20  0), 41);.    b4 
a390: 3d 20 52 4f 4c 36 34 28 28 61 34 31 5e 64 31 29  = ROL64((a41^d1)
a3a0: 2c 20 32 29 3b 0a 20 20 20 20 62 30 20 3d 20 52  , 2);.    b0 = R
a3b0: 4f 4c 36 34 28 28 61 32 32 5e 64 32 29 2c 20 36  OL64((a22^d2), 6
a3c0: 32 29 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c  2);.    b1 = ROL
a3d0: 36 34 28 28 61 30 33 5e 64 33 29 2c 20 35 35 29  64((a03^d3), 55)
a3e0: 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34  ;.    b2 = ROL64
a3f0: 28 28 61 33 34 5e 64 34 29 2c 20 33 39 29 3b 0a  ((a34^d4), 39);.
a400: 20 20 20 20 61 31 30 20 3d 20 20 20 62 30 20 5e      a10 =   b0 ^
a410: 28 28 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20  ((~b1)&  b2 );. 
a420: 20 20 20 61 34 31 20 3d 20 20 20 62 31 20 5e 28     a41 =   b1 ^(
a430: 28 7e 62 32 29 26 20 20 62 33 20 29 3b 0a 20 20  (~b2)&  b3 );.  
a440: 20 20 61 32 32 20 3d 20 20 20 62 32 20 5e 28 28    a22 =   b2 ^((
a450: 7e 62 33 29 26 20 20 62 34 20 29 3b 0a 20 20 20  ~b3)&  b4 );.   
a460: 20 61 30 33 20 3d 20 20 20 62 33 20 5e 28 28 7e   a03 =   b3 ^((~
a470: 62 34 29 26 20 20 62 30 20 29 3b 0a 20 20 20 20  b4)&  b0 );.    
a480: 61 33 34 20 3d 20 20 20 62 34 20 5e 28 28 7e 62  a34 =   b4 ^((~b
a490: 30 29 26 20 20 62 31 20 29 3b 0a 0a 20 20 20 20  0)&  b1 );..    
a4a0: 63 30 20 3d 20 61 30 30 5e 61 34 30 5e 61 33 30  c0 = a00^a40^a30
a4b0: 5e 61 32 30 5e 61 31 30 3b 0a 20 20 20 20 63 31  ^a20^a10;.    c1
a4c0: 20 3d 20 61 33 31 5e 61 32 31 5e 61 31 31 5e 61   = a31^a21^a11^a
a4d0: 30 31 5e 61 34 31 3b 0a 20 20 20 20 63 32 20 3d  01^a41;.    c2 =
a4e0: 20 61 31 32 5e 61 30 32 5e 61 34 32 5e 61 33 32   a12^a02^a42^a32
a4f0: 5e 61 32 32 3b 0a 20 20 20 20 63 33 20 3d 20 61  ^a22;.    c3 = a
a500: 34 33 5e 61 33 33 5e 61 32 33 5e 61 31 33 5e 61  43^a33^a23^a13^a
a510: 30 33 3b 0a 20 20 20 20 63 34 20 3d 20 61 32 34  03;.    c4 = a24
a520: 5e 61 31 34 5e 61 30 34 5e 61 34 34 5e 61 33 34  ^a14^a04^a44^a34
a530: 3b 0a 20 20 20 20 64 30 20 3d 20 63 34 5e 52 4f  ;.    d0 = c4^RO
a540: 4c 36 34 28 63 31 2c 20 31 29 3b 0a 20 20 20 20  L64(c1, 1);.    
a550: 64 31 20 3d 20 63 30 5e 52 4f 4c 36 34 28 63 32  d1 = c0^ROL64(c2
a560: 2c 20 31 29 3b 0a 20 20 20 20 64 32 20 3d 20 63  , 1);.    d2 = c
a570: 31 5e 52 4f 4c 36 34 28 63 33 2c 20 31 29 3b 0a  1^ROL64(c3, 1);.
a580: 20 20 20 20 64 33 20 3d 20 63 32 5e 52 4f 4c 36      d3 = c2^ROL6
a590: 34 28 63 34 2c 20 31 29 3b 0a 20 20 20 20 64 34  4(c4, 1);.    d4
a5a0: 20 3d 20 63 33 5e 52 4f 4c 36 34 28 63 30 2c 20   = c3^ROL64(c0, 
a5b0: 31 29 3b 0a 0a 20 20 20 20 62 30 20 3d 20 28 61  1);..    b0 = (a
a5c0: 30 30 5e 64 30 29 3b 0a 20 20 20 20 62 31 20 3d  00^d0);.    b1 =
a5d0: 20 52 4f 4c 36 34 28 28 61 32 31 5e 64 31 29 2c   ROL64((a21^d1),
a5e0: 20 34 34 29 3b 0a 20 20 20 20 62 32 20 3d 20 52   44);.    b2 = R
a5f0: 4f 4c 36 34 28 28 61 34 32 5e 64 32 29 2c 20 34  OL64((a42^d2), 4
a600: 33 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c  3);.    b3 = ROL
a610: 36 34 28 28 61 31 33 5e 64 33 29 2c 20 32 31 29  64((a13^d3), 21)
a620: 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34  ;.    b4 = ROL64
a630: 28 28 61 33 34 5e 64 34 29 2c 20 31 34 29 3b 0a  ((a34^d4), 14);.
a640: 20 20 20 20 61 30 30 20 3d 20 20 20 62 30 20 5e      a00 =   b0 ^
a650: 28 28 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20  ((~b1)&  b2 );. 
a660: 20 20 20 61 30 30 20 5e 3d 20 52 43 5b 69 2b 32     a00 ^= RC[i+2
a670: 5d 3b 0a 20 20 20 20 61 32 31 20 3d 20 20 20 62  ];.    a21 =   b
a680: 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29  1 ^((~b2)&  b3 )
a690: 3b 0a 20 20 20 20 61 34 32 20 3d 20 20 20 62 32  ;.    a42 =   b2
a6a0: 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b   ^((~b3)&  b4 );
a6b0: 0a 20 20 20 20 61 31 33 20 3d 20 20 20 62 33 20  .    a13 =   b3 
a6c0: 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a  ^((~b4)&  b0 );.
a6d0: 20 20 20 20 61 33 34 20 3d 20 20 20 62 34 20 5e      a34 =   b4 ^
a6e0: 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a  ((~b0)&  b1 );..
a6f0: 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28      b2 = ROL64((
a700: 61 33 30 5e 64 30 29 2c 20 33 29 3b 0a 20 20 20  a30^d0), 3);.   
a710: 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 30 31   b3 = ROL64((a01
a720: 5e 64 31 29 2c 20 34 35 29 3b 0a 20 20 20 20 62  ^d1), 45);.    b
a730: 34 20 3d 20 52 4f 4c 36 34 28 28 61 32 32 5e 64  4 = ROL64((a22^d
a740: 32 29 2c 20 36 31 29 3b 0a 20 20 20 20 62 30 20  2), 61);.    b0 
a750: 3d 20 52 4f 4c 36 34 28 28 61 34 33 5e 64 33 29  = ROL64((a43^d3)
a760: 2c 20 32 38 29 3b 0a 20 20 20 20 62 31 20 3d 20  , 28);.    b1 = 
a770: 52 4f 4c 36 34 28 28 61 31 34 5e 64 34 29 2c 20  ROL64((a14^d4), 
a780: 32 30 29 3b 0a 20 20 20 20 61 33 30 20 3d 20 20  20);.    a30 =  
a790: 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32   b0 ^((~b1)&  b2
a7a0: 20 29 3b 0a 20 20 20 20 61 30 31 20 3d 20 20 20   );.    a01 =   
a7b0: 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20  b1 ^((~b2)&  b3 
a7c0: 29 3b 0a 20 20 20 20 61 32 32 20 3d 20 20 20 62  );.    a22 =   b
a7d0: 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29  2 ^((~b3)&  b4 )
a7e0: 3b 0a 20 20 20 20 61 34 33 20 3d 20 20 20 62 33  ;.    a43 =   b3
a7f0: 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b   ^((~b4)&  b0 );
a800: 0a 20 20 20 20 61 31 34 20 3d 20 20 20 62 34 20  .    a14 =   b4 
a810: 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a  ^((~b0)&  b1 );.
a820: 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28  .    b4 = ROL64(
a830: 28 61 31 30 5e 64 30 29 2c 20 31 38 29 3b 0a 20  (a10^d0), 18);. 
a840: 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61     b0 = ROL64((a
a850: 33 31 5e 64 31 29 2c 20 31 29 3b 0a 20 20 20 20  31^d1), 1);.    
a860: 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 30 32 5e  b1 = ROL64((a02^
a870: 64 32 29 2c 20 36 29 3b 0a 20 20 20 20 62 32 20  d2), 6);.    b2 
a880: 3d 20 52 4f 4c 36 34 28 28 61 32 33 5e 64 33 29  = ROL64((a23^d3)
a890: 2c 20 32 35 29 3b 0a 20 20 20 20 62 33 20 3d 20  , 25);.    b3 = 
a8a0: 52 4f 4c 36 34 28 28 61 34 34 5e 64 34 29 2c 20  ROL64((a44^d4), 
a8b0: 38 29 3b 0a 20 20 20 20 61 31 30 20 3d 20 20 20  8);.    a10 =   
a8c0: 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62 32 20  b0 ^((~b1)&  b2 
a8d0: 29 3b 0a 20 20 20 20 61 33 31 20 3d 20 20 20 62  );.    a31 =   b
a8e0: 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33 20 29  1 ^((~b2)&  b3 )
a8f0: 3b 0a 20 20 20 20 61 30 32 20 3d 20 20 20 62 32  ;.    a02 =   b2
a900: 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20 29 3b   ^((~b3)&  b4 );
a910: 0a 20 20 20 20 61 32 33 20 3d 20 20 20 62 33 20  .    a23 =   b3 
a920: 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29 3b 0a  ^((~b4)&  b0 );.
a930: 20 20 20 20 61 34 34 20 3d 20 20 20 62 34 20 5e      a44 =   b4 ^
a940: 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b 0a 0a  ((~b0)&  b1 );..
a950: 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28      b1 = ROL64((
a960: 61 34 30 5e 64 30 29 2c 20 33 36 29 3b 0a 20 20  a40^d0), 36);.  
a970: 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 31    b2 = ROL64((a1
a980: 31 5e 64 31 29 2c 20 31 30 29 3b 0a 20 20 20 20  1^d1), 10);.    
a990: 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 33 32 5e  b3 = ROL64((a32^
a9a0: 64 32 29 2c 20 31 35 29 3b 0a 20 20 20 20 62 34  d2), 15);.    b4
a9b0: 20 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64 33   = ROL64((a03^d3
a9c0: 29 2c 20 35 36 29 3b 0a 20 20 20 20 62 30 20 3d  ), 56);.    b0 =
a9d0: 20 52 4f 4c 36 34 28 28 61 32 34 5e 64 34 29 2c   ROL64((a24^d4),
a9e0: 20 32 37 29 3b 0a 20 20 20 20 61 34 30 20 3d 20   27);.    a40 = 
a9f0: 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20 62    b0 ^((~b1)&  b
aa00: 32 20 29 3b 0a 20 20 20 20 61 31 31 20 3d 20 20  2 );.    a11 =  
aa10: 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62 33   b1 ^((~b2)&  b3
aa20: 20 29 3b 0a 20 20 20 20 61 33 32 20 3d 20 20 20   );.    a32 =   
aa30: 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34 20  b2 ^((~b3)&  b4 
aa40: 29 3b 0a 20 20 20 20 61 30 33 20 3d 20 20 20 62  );.    a03 =   b
aa50: 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20 29  3 ^((~b4)&  b0 )
aa60: 3b 0a 20 20 20 20 61 32 34 20 3d 20 20 20 62 34  ;.    a24 =   b4
aa70: 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29 3b   ^((~b0)&  b1 );
aa80: 0a 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36 34  ..    b3 = ROL64
aa90: 28 28 61 32 30 5e 64 30 29 2c 20 34 31 29 3b 0a  ((a20^d0), 41);.
aaa0: 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28 28      b4 = ROL64((
aab0: 61 34 31 5e 64 31 29 2c 20 32 29 3b 0a 20 20 20  a41^d1), 2);.   
aac0: 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61 31 32   b0 = ROL64((a12
aad0: 5e 64 32 29 2c 20 36 32 29 3b 0a 20 20 20 20 62  ^d2), 62);.    b
aae0: 31 20 3d 20 52 4f 4c 36 34 28 28 61 33 33 5e 64  1 = ROL64((a33^d
aaf0: 33 29 2c 20 35 35 29 3b 0a 20 20 20 20 62 32 20  3), 55);.    b2 
ab00: 3d 20 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29  = ROL64((a04^d4)
ab10: 2c 20 33 39 29 3b 0a 20 20 20 20 61 32 30 20 3d  , 39);.    a20 =
ab20: 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20     b0 ^((~b1)&  
ab30: 62 32 20 29 3b 0a 20 20 20 20 61 34 31 20 3d 20  b2 );.    a41 = 
ab40: 20 20 62 31 20 5e 28 28 7e 62 32 29 26 20 20 62    b1 ^((~b2)&  b
ab50: 33 20 29 3b 0a 20 20 20 20 61 31 32 20 3d 20 20  3 );.    a12 =  
ab60: 20 62 32 20 5e 28 28 7e 62 33 29 26 20 20 62 34   b2 ^((~b3)&  b4
ab70: 20 29 3b 0a 20 20 20 20 61 33 33 20 3d 20 20 20   );.    a33 =   
ab80: 62 33 20 5e 28 28 7e 62 34 29 26 20 20 62 30 20  b3 ^((~b4)&  b0 
ab90: 29 3b 0a 20 20 20 20 61 30 34 20 3d 20 20 20 62  );.    a04 =   b
aba0: 34 20 5e 28 28 7e 62 30 29 26 20 20 62 31 20 29  4 ^((~b0)&  b1 )
abb0: 3b 0a 0a 20 20 20 20 63 30 20 3d 20 61 30 30 5e  ;..    c0 = a00^
abc0: 61 33 30 5e 61 31 30 5e 61 34 30 5e 61 32 30 3b  a30^a10^a40^a20;
abd0: 0a 20 20 20 20 63 31 20 3d 20 61 32 31 5e 61 30  .    c1 = a21^a0
abe0: 31 5e 61 33 31 5e 61 31 31 5e 61 34 31 3b 0a 20  1^a31^a11^a41;. 
abf0: 20 20 20 63 32 20 3d 20 61 34 32 5e 61 32 32 5e     c2 = a42^a22^
ac00: 61 30 32 5e 61 33 32 5e 61 31 32 3b 0a 20 20 20  a02^a32^a12;.   
ac10: 20 63 33 20 3d 20 61 31 33 5e 61 34 33 5e 61 32   c3 = a13^a43^a2
ac20: 33 5e 61 30 33 5e 61 33 33 3b 0a 20 20 20 20 63  3^a03^a33;.    c
ac30: 34 20 3d 20 61 33 34 5e 61 31 34 5e 61 34 34 5e  4 = a34^a14^a44^
ac40: 61 32 34 5e 61 30 34 3b 0a 20 20 20 20 64 30 20  a24^a04;.    d0 
ac50: 3d 20 63 34 5e 52 4f 4c 36 34 28 63 31 2c 20 31  = c4^ROL64(c1, 1
ac60: 29 3b 0a 20 20 20 20 64 31 20 3d 20 63 30 5e 52  );.    d1 = c0^R
ac70: 4f 4c 36 34 28 63 32 2c 20 31 29 3b 0a 20 20 20  OL64(c2, 1);.   
ac80: 20 64 32 20 3d 20 63 31 5e 52 4f 4c 36 34 28 63   d2 = c1^ROL64(c
ac90: 33 2c 20 31 29 3b 0a 20 20 20 20 64 33 20 3d 20  3, 1);.    d3 = 
aca0: 63 32 5e 52 4f 4c 36 34 28 63 34 2c 20 31 29 3b  c2^ROL64(c4, 1);
acb0: 0a 20 20 20 20 64 34 20 3d 20 63 33 5e 52 4f 4c  .    d4 = c3^ROL
acc0: 36 34 28 63 30 2c 20 31 29 3b 0a 0a 20 20 20 20  64(c0, 1);..    
acd0: 62 30 20 3d 20 28 61 30 30 5e 64 30 29 3b 0a 20  b0 = (a00^d0);. 
ace0: 20 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61     b1 = ROL64((a
acf0: 30 31 5e 64 31 29 2c 20 34 34 29 3b 0a 20 20 20  01^d1), 44);.   
ad00: 20 62 32 20 3d 20 52 4f 4c 36 34 28 28 61 30 32   b2 = ROL64((a02
ad10: 5e 64 32 29 2c 20 34 33 29 3b 0a 20 20 20 20 62  ^d2), 43);.    b
ad20: 33 20 3d 20 52 4f 4c 36 34 28 28 61 30 33 5e 64  3 = ROL64((a03^d
ad30: 33 29 2c 20 32 31 29 3b 0a 20 20 20 20 62 34 20  3), 21);.    b4 
ad40: 3d 20 52 4f 4c 36 34 28 28 61 30 34 5e 64 34 29  = ROL64((a04^d4)
ad50: 2c 20 31 34 29 3b 0a 20 20 20 20 61 30 30 20 3d  , 14);.    a00 =
ad60: 20 20 20 62 30 20 5e 28 28 7e 62 31 29 26 20 20     b0 ^((~b1)&  
ad70: 62 32 20 29 3b 0a 20 20 20 20 61 30 30 20 5e 3d  b2 );.    a00 ^=
ad80: 20 52 43 5b 69 2b 33 5d 3b 0a 20 20 20 20 61 30   RC[i+3];.    a0
ad90: 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29  1 =   b1 ^((~b2)
ada0: 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 30 32  &  b3 );.    a02
adb0: 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26   =   b2 ^((~b3)&
adc0: 20 20 62 34 20 29 3b 0a 20 20 20 20 61 30 33 20    b4 );.    a03 
add0: 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20  =   b3 ^((~b4)& 
ade0: 20 62 30 20 29 3b 0a 20 20 20 20 61 30 34 20 3d   b0 );.    a04 =
adf0: 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20     b4 ^((~b0)&  
ae00: 62 31 20 29 3b 0a 0a 20 20 20 20 62 32 20 3d 20  b1 );..    b2 = 
ae10: 52 4f 4c 36 34 28 28 61 31 30 5e 64 30 29 2c 20  ROL64((a10^d0), 
ae20: 33 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c  3);.    b3 = ROL
ae30: 36 34 28 28 61 31 31 5e 64 31 29 2c 20 34 35 29  64((a11^d1), 45)
ae40: 3b 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34  ;.    b4 = ROL64
ae50: 28 28 61 31 32 5e 64 32 29 2c 20 36 31 29 3b 0a  ((a12^d2), 61);.
ae60: 20 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28      b0 = ROL64((
ae70: 61 31 33 5e 64 33 29 2c 20 32 38 29 3b 0a 20 20  a13^d3), 28);.  
ae80: 20 20 62 31 20 3d 20 52 4f 4c 36 34 28 28 61 31    b1 = ROL64((a1
ae90: 34 5e 64 34 29 2c 20 32 30 29 3b 0a 20 20 20 20  4^d4), 20);.    
aea0: 61 31 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62  a10 =   b0 ^((~b
aeb0: 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61  1)&  b2 );.    a
aec0: 31 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32  11 =   b1 ^((~b2
aed0: 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 31  )&  b3 );.    a1
aee0: 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29  2 =   b2 ^((~b3)
aef0: 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 31 33  &  b4 );.    a13
af00: 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26   =   b3 ^((~b4)&
af10: 20 20 62 30 20 29 3b 0a 20 20 20 20 61 31 34 20    b0 );.    a14 
af20: 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20  =   b4 ^((~b0)& 
af30: 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 34 20 3d   b1 );..    b4 =
af40: 20 52 4f 4c 36 34 28 28 61 32 30 5e 64 30 29 2c   ROL64((a20^d0),
af50: 20 31 38 29 3b 0a 20 20 20 20 62 30 20 3d 20 52   18);.    b0 = R
af60: 4f 4c 36 34 28 28 61 32 31 5e 64 31 29 2c 20 31  OL64((a21^d1), 1
af70: 29 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36  );.    b1 = ROL6
af80: 34 28 28 61 32 32 5e 64 32 29 2c 20 36 29 3b 0a  4((a22^d2), 6);.
af90: 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28      b2 = ROL64((
afa0: 61 32 33 5e 64 33 29 2c 20 32 35 29 3b 0a 20 20  a23^d3), 25);.  
afb0: 20 20 62 33 20 3d 20 52 4f 4c 36 34 28 28 61 32    b3 = ROL64((a2
afc0: 34 5e 64 34 29 2c 20 38 29 3b 0a 20 20 20 20 61  4^d4), 8);.    a
afd0: 32 30 20 3d 20 20 20 62 30 20 5e 28 28 7e 62 31  20 =   b0 ^((~b1
afe0: 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20 61 32  )&  b2 );.    a2
aff0: 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62 32 29  1 =   b1 ^((~b2)
b000: 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61 32 32  &  b3 );.    a22
b010: 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33 29 26   =   b2 ^((~b3)&
b020: 20 20 62 34 20 29 3b 0a 20 20 20 20 61 32 33 20    b4 );.    a23 
b030: 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29 26 20  =   b3 ^((~b4)& 
b040: 20 62 30 20 29 3b 0a 20 20 20 20 61 32 34 20 3d   b0 );.    a24 =
b050: 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26 20 20     b4 ^((~b0)&  
b060: 62 31 20 29 3b 0a 0a 20 20 20 20 62 31 20 3d 20  b1 );..    b1 = 
b070: 52 4f 4c 36 34 28 28 61 33 30 5e 64 30 29 2c 20  ROL64((a30^d0), 
b080: 33 36 29 3b 0a 20 20 20 20 62 32 20 3d 20 52 4f  36);.    b2 = RO
b090: 4c 36 34 28 28 61 33 31 5e 64 31 29 2c 20 31 30  L64((a31^d1), 10
b0a0: 29 3b 0a 20 20 20 20 62 33 20 3d 20 52 4f 4c 36  );.    b3 = ROL6
b0b0: 34 28 28 61 33 32 5e 64 32 29 2c 20 31 35 29 3b  4((a32^d2), 15);
b0c0: 0a 20 20 20 20 62 34 20 3d 20 52 4f 4c 36 34 28  .    b4 = ROL64(
b0d0: 28 61 33 33 5e 64 33 29 2c 20 35 36 29 3b 0a 20  (a33^d3), 56);. 
b0e0: 20 20 20 62 30 20 3d 20 52 4f 4c 36 34 28 28 61     b0 = ROL64((a
b0f0: 33 34 5e 64 34 29 2c 20 32 37 29 3b 0a 20 20 20  34^d4), 27);.   
b100: 20 61 33 30 20 3d 20 20 20 62 30 20 5e 28 28 7e   a30 =   b0 ^((~
b110: 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20 20  b1)&  b2 );.    
b120: 61 33 31 20 3d 20 20 20 62 31 20 5e 28 28 7e 62  a31 =   b1 ^((~b
b130: 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20 61  2)&  b3 );.    a
b140: 33 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62 33  32 =   b2 ^((~b3
b150: 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61 33  )&  b4 );.    a3
b160: 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34 29  3 =   b3 ^((~b4)
b170: 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 33 34  &  b0 );.    a34
b180: 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29 26   =   b4 ^((~b0)&
b190: 20 20 62 31 20 29 3b 0a 0a 20 20 20 20 62 33 20    b1 );..    b3 
b1a0: 3d 20 52 4f 4c 36 34 28 28 61 34 30 5e 64 30 29  = ROL64((a40^d0)
b1b0: 2c 20 34 31 29 3b 0a 20 20 20 20 62 34 20 3d 20  , 41);.    b4 = 
b1c0: 52 4f 4c 36 34 28 28 61 34 31 5e 64 31 29 2c 20  ROL64((a41^d1), 
b1d0: 32 29 3b 0a 20 20 20 20 62 30 20 3d 20 52 4f 4c  2);.    b0 = ROL
b1e0: 36 34 28 28 61 34 32 5e 64 32 29 2c 20 36 32 29  64((a42^d2), 62)
b1f0: 3b 0a 20 20 20 20 62 31 20 3d 20 52 4f 4c 36 34  ;.    b1 = ROL64
b200: 28 28 61 34 33 5e 64 33 29 2c 20 35 35 29 3b 0a  ((a43^d3), 55);.
b210: 20 20 20 20 62 32 20 3d 20 52 4f 4c 36 34 28 28      b2 = ROL64((
b220: 61 34 34 5e 64 34 29 2c 20 33 39 29 3b 0a 20 20  a44^d4), 39);.  
b230: 20 20 61 34 30 20 3d 20 20 20 62 30 20 5e 28 28    a40 =   b0 ^((
b240: 7e 62 31 29 26 20 20 62 32 20 29 3b 0a 20 20 20  ~b1)&  b2 );.   
b250: 20 61 34 31 20 3d 20 20 20 62 31 20 5e 28 28 7e   a41 =   b1 ^((~
b260: 62 32 29 26 20 20 62 33 20 29 3b 0a 20 20 20 20  b2)&  b3 );.    
b270: 61 34 32 20 3d 20 20 20 62 32 20 5e 28 28 7e 62  a42 =   b2 ^((~b
b280: 33 29 26 20 20 62 34 20 29 3b 0a 20 20 20 20 61  3)&  b4 );.    a
b290: 34 33 20 3d 20 20 20 62 33 20 5e 28 28 7e 62 34  43 =   b3 ^((~b4
b2a0: 29 26 20 20 62 30 20 29 3b 0a 20 20 20 20 61 34  )&  b0 );.    a4
b2b0: 34 20 3d 20 20 20 62 34 20 5e 28 28 7e 62 30 29  4 =   b4 ^((~b0)
b2c0: 26 20 20 62 31 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  &  b1 );.  }.}..
b2d0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
b2e0: 20 61 20 6e 65 77 20 68 61 73 68 2e 20 20 69 53   a new hash.  iS
b2f0: 69 7a 65 20 64 65 74 65 72 6d 69 6e 65 73 20 74  ize determines t
b300: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
b310: 61 73 68 0a 2a 2a 20 69 6e 20 62 69 74 73 20 61  ash.** in bits a
b320: 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65  nd should be one
b330: 20 6f 66 20 32 32 34 2c 20 32 35 36 2c 20 33 38   of 224, 256, 38
b340: 34 2c 20 6f 72 20 35 31 32 2e 20 20 4f 72 20 69  4, or 512.  Or i
b350: 53 69 7a 65 0a 2a 2a 20 63 61 6e 20 62 65 20 7a  Size.** can be z
b360: 65 72 6f 20 74 6f 20 75 73 65 20 74 68 65 20 64  ero to use the d
b370: 65 66 61 75 6c 74 20 68 61 73 68 20 73 69 7a 65  efault hash size
b380: 20 6f 66 20 32 35 36 20 62 69 74 73 2e 0a 2a 2f   of 256 bits..*/
b390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 48 41  .static void SHA
b3a0: 33 49 6e 69 74 28 53 48 41 33 43 6f 6e 74 65 78  3Init(SHA3Contex
b3b0: 74 20 2a 70 2c 20 69 6e 74 20 69 53 69 7a 65 29  t *p, int iSize)
b3c0: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
b3d0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
b3e0: 69 66 28 20 69 53 69 7a 65 3e 3d 31 32 38 20 26  if( iSize>=128 &
b3f0: 26 20 69 53 69 7a 65 3c 3d 35 31 32 20 29 7b 0a  & iSize<=512 ){.
b400: 20 20 20 20 70 2d 3e 6e 52 61 74 65 20 3d 20 28      p->nRate = (
b410: 31 36 30 30 20 2d 20 28 28 69 53 69 7a 65 20 2b  1600 - ((iSize +
b420: 20 33 31 29 26 7e 33 31 29 2a 32 29 2f 38 3b 0a   31)&~31)*2)/8;.
b430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
b440: 6e 52 61 74 65 20 3d 20 28 31 36 30 30 20 2d 20  nRate = (1600 - 
b450: 32 2a 32 35 36 29 2f 38 3b 0a 20 20 7d 0a 23 69  2*256)/8;.  }.#i
b460: 66 20 53 48 41 33 5f 42 59 54 45 4f 52 44 45 52  f SHA3_BYTEORDER
b470: 3d 3d 31 32 33 34 0a 20 20 2f 2a 20 4b 6e 6f 77  ==1234.  /* Know
b480: 6e 20 74 6f 20 62 65 20 6c 69 74 74 6c 65 2d 65  n to be little-e
b490: 6e 64 69 61 6e 20 61 74 20 63 6f 6d 70 69 6c 65  ndian at compile
b4a0: 2d 74 69 6d 65 2e 20 4e 6f 2d 6f 70 20 2a 2f 0a  -time. No-op */.
b4b0: 23 65 6c 69 66 20 53 48 41 33 5f 42 59 54 45 4f  #elif SHA3_BYTEO
b4c0: 52 44 45 52 3d 3d 34 33 32 31 0a 20 20 70 2d 3e  RDER==4321.  p->
b4d0: 69 78 4d 61 73 6b 20 3d 20 37 3b 20 20 2f 2a 20  ixMask = 7;  /* 
b4e0: 42 69 67 2d 65 6e 64 69 61 6e 20 2a 2f 0a 23 65  Big-endian */.#e
b4f0: 6c 73 65 0a 20 20 7b 0a 20 20 20 20 73 74 61 74  lse.  {.    stat
b500: 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
b510: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  one = 1;.    if(
b520: 20 31 3d 3d 2a 28 75 6e 73 69 67 6e 65 64 20 63   1==*(unsigned c
b530: 68 61 72 2a 29 26 6f 6e 65 20 29 7b 0a 20 20 20  har*)&one ){.   
b540: 20 20 20 2f 2a 20 4c 69 74 74 6c 65 20 65 6e 64     /* Little end
b550: 69 61 6e 2e 20 20 4e 6f 20 62 79 74 65 20 73 77  ian.  No byte sw
b560: 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  apping. */.     
b570: 20 70 2d 3e 69 78 4d 61 73 6b 20 3d 20 30 3b 0a   p->ixMask = 0;.
b580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b590: 20 2f 2a 20 42 69 67 20 65 6e 64 69 61 6e 2e 20   /* Big endian. 
b5a0: 20 42 79 74 65 20 73 77 61 70 2e 20 2a 2f 0a 20   Byte swap. */. 
b5b0: 20 20 20 20 20 70 2d 3e 69 78 4d 61 73 6b 20 3d       p->ixMask =
b5c0: 20 37 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   7;.    }.  }.#e
b5d0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
b5e0: 6b 65 20 63 6f 6e 73 65 63 75 74 69 76 65 20 63  ke consecutive c
b5f0: 61 6c 6c 73 20 74 6f 20 74 68 65 20 53 48 41 33  alls to the SHA3
b600: 55 70 64 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  Update function 
b610: 74 6f 20 61 64 64 20 6e 65 77 20 63 6f 6e 74 65  to add new conte
b620: 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  nt.** to the has
b630: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
b640: 20 53 48 41 33 55 70 64 61 74 65 28 0a 20 20 53   SHA3Update(.  S
b650: 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 2c 0a 20  HA3Context *p,. 
b660: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
b670: 63 68 61 72 20 2a 61 44 61 74 61 2c 0a 20 20 75  char *aData,.  u
b680: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 44 61 74  nsigned int nDat
b690: 61 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  a.){.  unsigned 
b6a0: 69 6e 74 20 69 20 3d 20 30 3b 0a 23 69 66 20 53  int i = 0;.#if S
b6b0: 48 41 33 5f 42 59 54 45 4f 52 44 45 52 3d 3d 31  HA3_BYTEORDER==1
b6c0: 32 33 34 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4c  234.  if( (p->nL
b6d0: 6f 61 64 65 64 20 25 20 38 29 3d 3d 30 20 26 26  oaded % 8)==0 &&
b6e0: 20 28 28 61 44 61 74 61 20 2d 20 28 63 6f 6e 73   ((aData - (cons
b6f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
b700: 29 30 29 26 37 29 3d 3d 30 20 29 7b 0a 20 20 20  )0)&7)==0 ){.   
b710: 20 66 6f 72 28 3b 20 69 2b 37 3c 6e 44 61 74 61   for(; i+7<nData
b720: 3b 20 69 2b 3d 38 29 7b 0a 20 20 20 20 20 20 70  ; i+=8){.      p
b730: 2d 3e 75 2e 73 5b 70 2d 3e 6e 4c 6f 61 64 65 64  ->u.s[p->nLoaded
b740: 2f 38 5d 20 5e 3d 20 2a 28 75 36 34 2a 29 26 61  /8] ^= *(u64*)&a
b750: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 20 20 70  Data[i];.      p
b760: 2d 3e 6e 4c 6f 61 64 65 64 20 2b 3d 20 38 3b 0a  ->nLoaded += 8;.
b770: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 4c 6f        if( p->nLo
b780: 61 64 65 64 3e 3d 70 2d 3e 6e 52 61 74 65 20 29  aded>=p->nRate )
b790: 7b 0a 20 20 20 20 20 20 20 20 4b 65 63 63 61 6b  {.        Keccak
b7a0: 46 31 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20  F1600Step(p);.  
b7b0: 20 20 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64        p->nLoaded
b7c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
b7d0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
b7e0: 20 66 6f 72 28 3b 20 69 3c 6e 44 61 74 61 3b 20   for(; i<nData; 
b7f0: 69 2b 2b 29 7b 0a 23 69 66 20 53 48 41 33 5f 42  i++){.#if SHA3_B
b800: 59 54 45 4f 52 44 45 52 3d 3d 31 32 33 34 0a 20  YTEORDER==1234. 
b810: 20 20 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f     p->u.x[p->nLo
b820: 61 64 65 64 5d 20 5e 3d 20 61 44 61 74 61 5b 69  aded] ^= aData[i
b830: 5d 3b 0a 23 65 6c 69 66 20 53 48 41 33 5f 42 59  ];.#elif SHA3_BY
b840: 54 45 4f 52 44 45 52 3d 3d 34 33 32 31 0a 20 20  TEORDER==4321.  
b850: 20 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61    p->u.x[p->nLoa
b860: 64 65 64 5e 30 78 30 37 5d 20 5e 3d 20 61 44 61  ded^0x07] ^= aDa
b870: 74 61 5b 69 5d 3b 0a 23 65 6c 73 65 0a 20 20 20  ta[i];.#else.   
b880: 20 70 2d 3e 75 2e 78 5b 70 2d 3e 6e 4c 6f 61 64   p->u.x[p->nLoad
b890: 65 64 5e 70 2d 3e 69 78 4d 61 73 6b 5d 20 5e 3d  ed^p->ixMask] ^=
b8a0: 20 61 44 61 74 61 5b 69 5d 3b 0a 23 65 6e 64 69   aData[i];.#endi
b8b0: 66 0a 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64  f.    p->nLoaded
b8c0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
b8d0: 4c 6f 61 64 65 64 3d 3d 70 2d 3e 6e 52 61 74 65  Loaded==p->nRate
b8e0: 20 29 7b 0a 20 20 20 20 20 20 4b 65 63 63 61 6b   ){.      Keccak
b8f0: 46 31 36 30 30 53 74 65 70 28 70 29 3b 0a 20 20  F1600Step(p);.  
b900: 20 20 20 20 70 2d 3e 6e 4c 6f 61 64 65 64 20 3d      p->nLoaded =
b910: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
b920: 0a 2f 2a 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  ./*.** After all
b930: 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
b940: 6e 20 61 64 64 65 64 2c 20 69 6e 76 6f 6b 65 20  n added, invoke 
b950: 53 48 41 33 46 69 6e 61 6c 28 29 20 74 6f 20 63  SHA3Final() to c
b960: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 66 69  ompute.** the fi
b970: 6e 61 6c 20 68 61 73 68 2e 20 20 54 68 65 20 66  nal hash.  The f
b980: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
b990: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b9a0: 20 62 69 6e 61 72 79 0a 2a 2a 20 68 61 73 68 20   binary.** hash 
b9b0: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
b9c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b9d0: 53 48 41 33 46 69 6e 61 6c 28 53 48 41 33 43 6f  SHA3Final(SHA3Co
b9e0: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 75 6e 73  ntext *p){.  uns
b9f0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
ba00: 66 28 20 70 2d 3e 6e 4c 6f 61 64 65 64 3d 3d 70  f( p->nLoaded==p
ba10: 2d 3e 6e 52 61 74 65 2d 31 20 29 7b 0a 20 20 20  ->nRate-1 ){.   
ba20: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
ba30: 63 68 61 72 20 63 31 20 3d 20 30 78 38 36 3b 0a  char c1 = 0x86;.
ba40: 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28 70      SHA3Update(p
ba50: 2c 20 26 63 31 2c 20 31 29 3b 0a 20 20 7d 65 6c  , &c1, 1);.  }el
ba60: 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  se{.    const un
ba70: 73 69 67 6e 65 64 20 63 68 61 72 20 63 32 20 3d  signed char c2 =
ba80: 20 30 78 30 36 3b 0a 20 20 20 20 63 6f 6e 73 74   0x06;.    const
ba90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
baa0: 33 20 3d 20 30 78 38 30 3b 0a 20 20 20 20 53 48  3 = 0x80;.    SH
bab0: 41 33 55 70 64 61 74 65 28 70 2c 20 26 63 32 2c  A3Update(p, &c2,
bac0: 20 31 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 61   1);.    p->nLoa
bad0: 64 65 64 20 3d 20 70 2d 3e 6e 52 61 74 65 20 2d  ded = p->nRate -
bae0: 20 31 3b 0a 20 20 20 20 53 48 41 33 55 70 64 61   1;.    SHA3Upda
baf0: 74 65 28 70 2c 20 26 63 33 2c 20 31 29 3b 0a 20  te(p, &c3, 1);. 
bb00: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
bb10: 70 2d 3e 6e 52 61 74 65 3b 20 69 2b 2b 29 7b 0a  p->nRate; i++){.
bb20: 20 20 20 20 70 2d 3e 75 2e 78 5b 69 2b 70 2d 3e      p->u.x[i+p->
bb30: 6e 52 61 74 65 5d 20 3d 20 70 2d 3e 75 2e 78 5b  nRate] = p->u.x[
bb40: 69 5e 70 2d 3e 69 78 4d 61 73 6b 5d 3b 0a 20 20  i^p->ixMask];.  
bb50: 7d 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 75  }.  return &p->u
bb60: 2e 78 5b 70 2d 3e 6e 52 61 74 65 5d 3b 0a 7d 0a  .x[p->nRate];.}.
bb70: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 68 61  /* End of the ha
bb80: 73 68 69 6e 67 20 6c 6f 67 69 63 0a 2a 2a 2a 2a  shing logic.****
bb90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bbd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
bbe0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
bbf0: 20 6f 66 20 74 68 65 20 73 68 61 33 28 58 2c 53   of the sha3(X,S
bc00: 49 5a 45 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  IZE) function..*
bc10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 42 4c  *.** Return a BL
bc20: 4f 42 20 77 68 69 63 68 20 69 73 20 74 68 65 20  OB which is the 
bc30: 53 49 5a 45 2d 62 69 74 20 53 48 41 33 20 68 61  SIZE-bit SHA3 ha
bc40: 73 68 20 6f 66 20 58 2e 20 20 54 68 65 20 64 65  sh of X.  The de
bc50: 66 61 75 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73  fault.** size is
bc60: 20 32 35 36 2e 20 20 49 66 20 58 20 69 73 20 61   256.  If X is a
bc70: 20 42 4c 4f 42 2c 20 69 74 20 69 73 20 68 61 73   BLOB, it is has
bc80: 68 65 64 20 61 73 20 69 73 2e 20 20 0a 2a 2a 20  hed as is.  .** 
bc90: 46 6f 72 20 61 6c 6c 20 6f 74 68 65 72 20 6e 6f  For all other no
bca0: 6e 2d 4e 55 4c 4c 20 74 79 70 65 73 20 6f 66 20  n-NULL types of 
bcb0: 69 6e 70 75 74 2c 20 58 20 69 73 20 63 6f 6e 76  input, X is conv
bcc0: 65 72 74 65 64 20 69 6e 74 6f 20 61 20 55 54 46  erted into a UTF
bcd0: 2d 38 20 73 74 72 69 6e 67 0a 2a 2a 20 61 6e 64  -8 string.** and
bce0: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 68   the string is h
bcf0: 61 73 68 65 64 20 77 69 74 68 6f 75 74 20 74 68  ashed without th
bd00: 65 20 74 72 61 69 6c 69 6e 67 20 30 78 30 30 20  e trailing 0x00 
bd10: 74 65 72 6d 69 6e 61 74 6f 72 2e 20 20 54 68 65  terminator.  The
bd20: 20 68 61 73 68 0a 2a 2a 20 6f 66 20 61 20 4e 55   hash.** of a NU
bd30: 4c 4c 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  LL value is NULL
bd40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bd50: 20 73 68 61 33 46 75 6e 63 28 0a 20 20 73 71 6c   sha3Func(.  sql
bd60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
bd70: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
bd80: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
bd90: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 53  ue **argv.){.  S
bda0: 48 41 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20  HA3Context cx;. 
bdb0: 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
bdc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
bdd0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  argv[0]);.  int 
bde0: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
bdf0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
be00: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 69 53 69 7a  [0]);.  int iSiz
be10: 65 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31  e;.  if( argc==1
be20: 20 29 7b 0a 20 20 20 20 69 53 69 7a 65 20 3d 20   ){.    iSize = 
be30: 32 35 36 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  256;.  }else{.  
be40: 20 20 69 53 69 7a 65 20 3d 20 73 71 6c 69 74 65    iSize = sqlite
be50: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
be60: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 53  [1]);.    if( iS
be70: 69 7a 65 21 3d 32 32 34 20 26 26 20 69 53 69 7a  ize!=224 && iSiz
be80: 65 21 3d 32 35 36 20 26 26 20 69 53 69 7a 65 21  e!=256 && iSize!
be90: 3d 33 38 34 20 26 26 20 69 53 69 7a 65 21 3d 35  =384 && iSize!=5
bea0: 31 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  12 ){.      sqli
beb0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
bec0: 28 63 6f 6e 74 65 78 74 2c 20 22 53 48 41 33 20  (context, "SHA3 
bed0: 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 20 6f  size should be o
bee0: 6e 65 20 6f 66 3a 20 32 32 34 20 32 35 36 20 22  ne of: 224 256 "
bef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 20 20 22 33 38 34 20 35 31 32 22 2c 20       "384 512", 
bf20: 2d 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  -1);.      retur
bf30: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
bf40: 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  f( eType==SQLITE
bf50: 5f 4e 55 4c 4c 20 29 20 72 65 74 75 72 6e 3b 0a  _NULL ) return;.
bf60: 20 20 53 48 41 33 49 6e 69 74 28 26 63 78 2c 20    SHA3Init(&cx, 
bf70: 69 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 65 54  iSize);.  if( eT
bf80: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
bf90: 20 29 7b 0a 20 20 20 20 53 48 41 33 55 70 64 61   ){.    SHA3Upda
bfa0: 74 65 28 26 63 78 2c 20 73 71 6c 69 74 65 33 5f  te(&cx, sqlite3_
bfb0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
bfc0: 30 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  0]), nByte);.  }
bfd0: 65 6c 73 65 7b 0a 20 20 20 20 53 48 41 33 55 70  else{.    SHA3Up
bfe0: 64 61 74 65 28 26 63 78 2c 20 73 71 6c 69 74 65  date(&cx, sqlite
bff0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
c000: 76 5b 30 5d 29 2c 20 6e 42 79 74 65 29 3b 0a 20  v[0]), nByte);. 
c010: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
c020: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
c030: 2c 20 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29  , SHA3Final(&cx)
c040: 2c 20 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54  , iSize/8, SQLIT
c050: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
c060: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  ./* Compute a st
c070: 72 69 6e 67 20 75 73 69 6e 67 20 73 71 6c 69 74  ring using sqlit
c080: 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 29 20 77  e3_vsnprintf() w
c090: 69 74 68 20 61 20 6d 61 78 69 6d 75 6d 20 6c 65  ith a maximum le
c0a0: 6e 67 74 68 0a 2a 2a 20 6f 66 20 35 30 20 62 79  ngth.** of 50 by
c0b0: 74 65 73 20 61 6e 64 20 61 64 64 20 69 74 20 74  tes and add it t
c0c0: 6f 20 74 68 65 20 68 61 73 68 2e 0a 2a 2f 0a 73  o the hash..*/.s
c0d0: 74 61 74 69 63 20 76 6f 69 64 20 68 61 73 68 5f  tatic void hash_
c0e0: 73 74 65 70 5f 76 66 6f 72 6d 61 74 28 0a 20 20  step_vformat(.  
c0f0: 53 48 41 33 43 6f 6e 74 65 78 74 20 2a 70 2c 20  SHA3Context *p, 
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 2f 2a 20 41 64 64 20 63 6f 6e 74 65 6e 74 20 74  /* Add content t
c120: 6f 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 2a  o this context *
c130: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c140: 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29  zFormat,.  ....)
c150: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
c160: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
c170: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 76 61 5f 73  zBuf[50];.  va_s
c180: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
c190: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 73 6e  );.  sqlite3_vsn
c1a0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
c1b0: 75 66 29 2c 7a 42 75 66 2c 7a 46 6f 72 6d 61 74  uf),zBuf,zFormat
c1c0: 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61  ,ap);.  va_end(a
c1d0: 70 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73  p);.  n = (int)s
c1e0: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 53  trlen(zBuf);.  S
c1f0: 48 41 33 55 70 64 61 74 65 28 70 2c 20 28 75 6e  HA3Update(p, (un
c200: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
c210: 66 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, n);.}../*.** 
c220: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
c230: 66 20 74 68 65 20 73 68 61 33 5f 71 75 65 72 79  f the sha3_query
c240: 28 53 51 4c 2c 53 49 5a 45 29 20 66 75 6e 63 74  (SQL,SIZE) funct
c250: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
c260: 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65  function compile
c270: 73 20 61 6e 64 20 72 75 6e 73 20 74 68 65 20 53  s and runs the S
c280: 51 4c 20 73 74 61 74 65 6d 65 6e 74 28 73 29 20  QL statement(s) 
c290: 67 69 76 65 6e 20 69 6e 20 74 68 65 0a 2a 2a 20  given in the.** 
c2a0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 72 65  argument. The re
c2b0: 73 75 6c 74 73 20 61 72 65 20 68 61 73 68 65 64  sults are hashed
c2c0: 20 75 73 69 6e 67 20 61 20 53 49 5a 45 2d 62 69   using a SIZE-bi
c2d0: 74 20 53 48 41 33 2e 20 20 54 68 65 20 64 65 66  t SHA3.  The def
c2e0: 61 75 6c 74 0a 2a 2a 20 73 69 7a 65 20 69 73 20  ault.** size is 
c2f0: 32 35 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  256..**.** The f
c300: 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 62 79 74  ormat of the byt
c310: 65 20 73 74 72 65 61 6d 20 74 68 61 74 20 69 73  e stream that is
c320: 20 68 61 73 68 65 64 20 69 73 20 73 75 6d 6d 61   hashed is summa
c330: 72 69 7a 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  rized as follows
c340: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 3c  :.**.**       S<
c350: 6e 3e 3a 3c 73 71 6c 3e 0a 2a 2a 20 20 20 20 20  n>:<sql>.**     
c360: 20 20 52 0a 2a 2a 20 20 20 20 20 20 20 4e 0a 2a    R.**       N.*
c370: 2a 20 20 20 20 20 20 20 49 3c 69 6e 74 3e 0a 2a  *       I<int>.*
c380: 2a 20 20 20 20 20 20 20 46 3c 69 65 65 65 2d 66  *       F<ieee-f
c390: 6c 6f 61 74 3e 0a 2a 2a 20 20 20 20 20 20 20 42  loat>.**       B
c3a0: 3c 73 69 7a 65 3e 3a 3c 62 79 74 65 73 3e 0a 2a  <size>:<bytes>.*
c3b0: 2a 20 20 20 20 20 20 20 54 3c 73 69 7a 65 3e 3a  *       T<size>:
c3c0: 3c 74 65 78 74 3e 0a 2a 2a 0a 2a 2a 20 3c 73 71  <text>.**.** <sq
c3d0: 6c 3e 20 69 73 20 74 68 65 20 6f 72 69 67 69 6e  l> is the origin
c3e0: 61 6c 20 53 51 4c 20 74 65 78 74 20 66 6f 72 20  al SQL text for 
c3f0: 65 61 63 68 20 73 74 61 74 65 6d 65 6e 74 20 72  each statement r
c400: 75 6e 20 61 6e 64 20 3c 6e 3e 20 69 73 0a 2a 2a  un and <n> is.**
c410: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 61   the size of tha
c420: 74 20 74 65 78 74 2e 20 20 54 68 65 20 53 51 4c  t text.  The SQL
c430: 20 74 65 78 74 20 69 73 20 55 54 46 2d 38 2e 20   text is UTF-8. 
c440: 20 41 20 73 69 6e 67 6c 65 20 52 20 63 68 61 72   A single R char
c450: 61 63 74 65 72 0a 2a 2a 20 6f 63 63 75 72 73 20  acter.** occurs 
c460: 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 72 74  before the start
c470: 20 6f 66 20 65 61 63 68 20 72 6f 77 2e 20 20 4e   of each row.  N
c480: 20 6d 65 61 6e 73 20 61 20 4e 55 4c 4c 20 76 61   means a NULL va
c490: 6c 75 65 2e 0a 2a 2a 20 49 20 6d 65 61 6e 20 61  lue..** I mean a
c4a0: 6e 20 38 2d 62 79 74 65 20 6c 69 74 74 6c 65 2d  n 8-byte little-
c4b0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 3c  endian integer <
c4c0: 69 6e 74 3e 2e 20 20 46 20 69 73 20 61 20 66 6c  int>.  F is a fl
c4d0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
c4e0: 6e 75 6d 62 65 72 20 77 69 74 68 20 61 6e 20 38  number with an 8
c4f0: 2d 62 79 74 65 20 6c 69 74 74 6c 65 2d 65 6e 64  -byte little-end
c500: 69 61 6e 20 49 45 45 45 20 66 6c 6f 61 74 69 6e  ian IEEE floatin
c510: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 3c 69  g point value <i
c520: 65 65 65 2d 66 6c 6f 61 74 3e 2e 0a 2a 2a 20 42  eee-float>..** B
c530: 20 6d 65 61 6e 73 20 62 6c 6f 62 73 20 6f 66 20   means blobs of 
c540: 3c 73 69 7a 65 3e 20 62 79 74 65 73 2e 20 20 54  <size> bytes.  T
c550: 20 6d 65 61 6e 73 20 74 65 78 74 20 72 65 6e 64   means text rend
c560: 65 72 65 64 20 61 73 20 3c 73 69 7a 65 3e 0a 2a  ered as <size>.*
c570: 2a 20 62 79 74 65 73 20 6f 66 20 55 54 46 2d 38  * bytes of UTF-8
c580: 2e 20 20 54 68 65 20 3c 6e 3e 20 61 6e 64 20 3c  .  The <n> and <
c590: 73 69 7a 65 3e 20 76 61 6c 75 65 73 20 61 72 65  size> values are
c5a0: 20 65 78 70 72 65 73 73 65 64 20 61 73 20 61 6e   expressed as an
c5b0: 20 41 53 43 49 49 0a 2a 2a 20 74 65 78 74 20 69   ASCII.** text i
c5c0: 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 46  ntegers..**.** F
c5d0: 6f 72 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  or each SQL stat
c5e0: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 58 20 69  ement in the X i
c5f0: 6e 70 75 74 2c 20 74 68 65 72 65 20 69 73 20 6f  nput, there is o
c600: 6e 65 20 53 20 73 65 67 6d 65 6e 74 2e 20 20 45  ne S segment.  E
c610: 61 63 68 0a 2a 2a 20 53 20 73 65 67 6d 65 6e 74  ach.** S segment
c620: 20 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   is followed by 
c630: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 52 20 73  zero or more R s
c640: 65 67 6d 65 6e 74 73 2c 20 6f 6e 65 20 66 6f 72  egments, one for
c650: 20 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65   each row in the
c660: 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 2e 20  .** result set. 
c670: 20 41 66 74 65 72 20 65 61 63 68 20 52 2c 20 74   After each R, t
c680: 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
c690: 6d 6f 72 65 20 4e 2c 20 49 2c 20 46 2c 20 42 2c  more N, I, F, B,
c6a0: 20 6f 72 20 54 20 73 65 67 6d 65 6e 74 73 2c 0a   or T segments,.
c6b0: 2a 2a 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  ** one for each 
c6c0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
c6d0: 73 75 6c 74 20 73 65 74 2e 20 20 53 65 67 6d 65  sult set.  Segme
c6e0: 6e 74 73 20 61 72 65 20 63 6f 6e 63 61 74 65 6e  nts are concaten
c6f0: 74 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  tated directly.*
c700: 2a 20 77 69 74 68 20 6e 6f 20 64 65 6c 69 6d 69  * with no delimi
c710: 74 65 72 73 20 6f 66 20 61 6e 79 20 6b 69 6e 64  ters of any kind
c720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c730: 20 73 68 61 33 51 75 65 72 79 46 75 6e 63 28 0a   sha3QueryFunc(.
c740: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
c750: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
c760: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
c770: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
c780: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c790: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
c7a0: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74  t_db_handle(cont
c7b0: 65 78 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ext);.  const ch
c7c0: 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73  ar *zSql = (cons
c7d0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
c7e0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
c7f0: 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  0]);.  sqlite3_s
c800: 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
c810: 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c830: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
c840: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
c850: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b   set */.  int i;
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c880: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
c890: 63 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  c;.  int n;.  co
c8a0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 53  nst char *z;.  S
c8b0: 48 41 33 43 6f 6e 74 65 78 74 20 63 78 3b 0a 20  HA3Context cx;. 
c8c0: 20 69 6e 74 20 69 53 69 7a 65 3b 0a 0a 20 20 69   int iSize;..  i
c8d0: 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20 20  f( argc==1 ){.  
c8e0: 20 20 69 53 69 7a 65 20 3d 20 32 35 36 3b 0a 20    iSize = 256;. 
c8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 53 69 7a   }else{.    iSiz
c900: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
c910: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 3b 0a  e_int(argv[1]);.
c920: 20 20 20 20 69 66 28 20 69 53 69 7a 65 21 3d 32      if( iSize!=2
c930: 32 34 20 26 26 20 69 53 69 7a 65 21 3d 32 35 36  24 && iSize!=256
c940: 20 26 26 20 69 53 69 7a 65 21 3d 33 38 34 20 26   && iSize!=384 &
c950: 26 20 69 53 69 7a 65 21 3d 35 31 32 20 29 7b 0a  & iSize!=512 ){.
c960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
c970: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
c980: 78 74 2c 20 22 53 48 41 33 20 73 69 7a 65 20 73  xt, "SHA3 size s
c990: 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
c9a0: 20 32 32 34 20 32 35 36 20 22 0a 20 20 20 20 20   224 256 ".     
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c9d0: 33 38 34 20 35 31 32 22 2c 20 2d 31 29 3b 0a 20  384 512", -1);. 
c9e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
c9f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53 71   }.  }.  if( zSq
ca00: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  l==0 ) return;. 
ca10: 20 53 48 41 33 49 6e 69 74 28 26 63 78 2c 20 69   SHA3Init(&cx, i
ca20: 53 69 7a 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Size);.  while( 
ca30: 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 72  zSql[0] ){.    r
ca40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
ca50: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
ca60: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 53   -1, &pStmt, &zS
ca70: 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ql);.    if( rc 
ca80: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
ca90: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
caa0: 72 69 6e 74 66 28 22 65 72 72 6f 72 20 53 51 4c  rintf("error SQL
cab0: 20 73 74 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a   statement [%s]:
cac0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 20 20 20 7a 53 71 6c 2c 20 73           zSql, s
caf0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
cb00: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
cb10: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
cb20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cb30: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
cb40: 6e 74 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29  ntext, zMsg, -1)
cb50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
cb60: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20  free(zMsg);.    
cb70: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
cb80: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
cb90: 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
cba0: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
cbb0: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69  har *zMsg = sqli
cbc0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 6e  te3_mprintf("non
cbd0: 2d 71 75 65 72 79 3a 20 5b 25 73 5d 22 2c 20 73  -query: [%s]", s
cbe0: 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
cbf0: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
cc00: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
cc10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cc20: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
cc30: 6e 74 65 78 74 2c 20 7a 4d 73 67 2c 20 2d 31 29  ntext, zMsg, -1)
cc40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
cc50: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20  free(zMsg);.    
cc60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
cc70: 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
cc80: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
cc90: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20  pStmt);.    z = 
cca0: 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
ccb0: 74 29 3b 0a 20 20 20 20 6e 20 3d 20 28 69 6e 74  t);.    n = (int
ccc0: 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20  )strlen(z);.    
ccd0: 68 61 73 68 5f 73 74 65 70 5f 76 66 6f 72 6d 61  hash_step_vforma
cce0: 74 28 26 63 78 2c 22 53 25 64 3a 22 2c 6e 29 3b  t(&cx,"S%d:",n);
ccf0: 0a 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28  .    SHA3Update(
cd00: 26 63 78 2c 28 75 6e 73 69 67 6e 65 64 20 63 68  &cx,(unsigned ch
cd10: 61 72 2a 29 7a 2c 6e 29 3b 0a 0a 20 20 20 20 2f  ar*)z,n);..    /
cd20: 2a 20 43 6f 6d 70 75 74 65 20 61 20 68 61 73 68  * Compute a hash
cd30: 20 6f 76 65 72 20 74 68 65 20 72 65 73 75 6c 74   over the result
cd40: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
cd50: 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
cd60: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
cd70: 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
cd80: 20 20 20 20 20 53 48 41 33 55 70 64 61 74 65 28       SHA3Update(
cd90: 26 63 78 2c 28 63 6f 6e 73 74 20 75 6e 73 69 67  &cx,(const unsig
cda0: 6e 65 64 20 63 68 61 72 2a 29 22 52 22 2c 31 29  ned char*)"R",1)
cdb0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
cdc0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
cdd0: 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
cde0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
cdf0: 70 65 28 70 53 74 6d 74 2c 69 29 20 29 7b 0a 20  pe(pStmt,i) ){. 
ce00: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
ce10: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
ce20: 20 20 20 20 20 20 20 20 20 53 48 41 33 55 70 64           SHA3Upd
ce30: 61 74 65 28 26 63 78 2c 20 28 63 6f 6e 73 74 20  ate(&cx, (const 
ce40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22  unsigned char*)"
ce50: 4e 22 2c 31 29 3b 0a 20 20 20 20 20 20 20 20 20  N",1);.         
ce60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ce70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ce80: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
ce90: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  GER: {.         
cea0: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
ceb0: 34 20 75 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4 u;.           
cec0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
ced0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
cee0: 72 20 78 5b 39 5d 3b 0a 20 20 20 20 20 20 20 20  r x[9];.        
cef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
cf00: 34 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  4 v = sqlite3_co
cf10: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
cf20: 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,i);.           
cf30: 20 6d 65 6d 63 70 79 28 26 75 2c 20 26 76 2c 20   memcpy(&u, &v, 
cf40: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  8);.            
cf50: 66 6f 72 28 6a 3d 38 3b 20 6a 3e 3d 31 3b 20 6a  for(j=8; j>=1; j
cf60: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
cf70: 20 20 20 78 5b 6a 5d 20 3d 20 75 20 26 20 30 78     x[j] = u & 0x
cf80: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ff;.            
cf90: 20 20 75 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 20    u >>= 8;.     
cfa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cfb0: 20 20 20 20 20 78 5b 30 5d 20 3d 20 27 49 27 3b       x[0] = 'I';
cfc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41  .            SHA
cfd0: 33 55 70 64 61 74 65 28 26 63 78 2c 20 78 2c 20  3Update(&cx, x, 
cfe0: 39 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  9);.            
cff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
d000: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   }.          cas
d010: 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20  e SQLITE_FLOAT: 
d020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
d030: 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75 3b 0a  lite3_uint64 u;.
d040: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
d050: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  j;.            u
d060: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b 39  nsigned char x[9
d070: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ];.            d
d080: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
d090: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
d0a0: 70 53 74 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20  pStmt,i);.      
d0b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 75 2c        memcpy(&u,
d0c0: 20 26 72 2c 20 38 29 3b 0a 20 20 20 20 20 20 20   &r, 8);.       
d0d0: 20 20 20 20 20 66 6f 72 28 6a 3d 38 3b 20 6a 3e       for(j=8; j>
d0e0: 3d 31 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =1; j--){.      
d0f0: 20 20 20 20 20 20 20 20 78 5b 6a 5d 20 3d 20 75          x[j] = u
d100: 20 26 20 30 78 66 66 3b 0a 20 20 20 20 20 20 20   & 0xff;.       
d110: 20 20 20 20 20 20 20 75 20 3e 3e 3d 20 38 3b 0a         u >>= 8;.
d120: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d130: 20 20 20 20 20 20 20 20 20 20 78 5b 30 5d 20 3d            x[0] =
d140: 20 27 46 27 3b 0a 20 20 20 20 20 20 20 20 20 20   'F';.          
d150: 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78    SHA3Update(&cx
d160: 2c 78 2c 39 29 3b 0a 20 20 20 20 20 20 20 20 20  ,x,9);.         
d170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d180: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
d190: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
d1a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
d1b0: 69 6e 74 20 6e 32 20 3d 20 73 71 6c 69 74 65 33  int n2 = sqlite3
d1c0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
d1d0: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
d1e0: 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67       const unsig
d1f0: 6e 65 64 20 63 68 61 72 20 2a 7a 32 20 3d 20 73  ned char *z2 = s
d200: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
d210: 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  xt(pStmt, i);.  
d220: 20 20 20 20 20 20 20 20 20 20 68 61 73 68 5f 73            hash_s
d230: 74 65 70 5f 76 66 6f 72 6d 61 74 28 26 63 78 2c  tep_vformat(&cx,
d240: 22 54 25 64 3a 22 2c 6e 32 29 3b 0a 20 20 20 20  "T%d:",n2);.    
d250: 20 20 20 20 20 20 20 20 53 48 41 33 55 70 64 61          SHA3Upda
d260: 74 65 28 26 63 78 2c 20 7a 32 2c 20 6e 32 29 3b  te(&cx, z2, n2);
d270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
d280: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
d290: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53            case S
d2a0: 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20  QLITE_BLOB: {.  
d2b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 32            int n2
d2c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
d2d0: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69  n_bytes(pStmt, i
d2e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
d2f0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
d300: 61 72 20 2a 7a 32 20 3d 20 73 71 6c 69 74 65 33  ar *z2 = sqlite3
d310: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
d320: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
d330: 20 20 20 20 68 61 73 68 5f 73 74 65 70 5f 76 66      hash_step_vf
d340: 6f 72 6d 61 74 28 26 63 78 2c 22 42 25 64 3a 22  ormat(&cx,"B%d:"
d350: 2c 6e 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,n2);.          
d360: 20 20 53 48 41 33 55 70 64 61 74 65 28 26 63 78    SHA3Update(&cx
d370: 2c 20 7a 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20  , z2, n2);.     
d380: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d390: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d3a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d3b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
d3c0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
d3d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
d3e0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
d3f0: 2c 20 53 48 41 33 46 69 6e 61 6c 28 26 63 78 29  , SHA3Final(&cx)
d400: 2c 20 69 53 69 7a 65 2f 38 2c 20 53 51 4c 49 54  , iSize/8, SQLIT
d410: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
d420: 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ..#ifdef _WIN32.
d430: 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69  .#endif.int sqli
d440: 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69  te3_shathree_ini
d450: 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
d460: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
d470: 4d 73 67 2c 0a 20 20 63 6f 6e 73 74 20 73 71 6c  Msg,.  const sql
d480: 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
d490: 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74  s *pApi.){.  int
d4a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d4b0: 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
d4c0: 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
d4d0: 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73  .  (void)pzErrMs
d4e0: 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61  g;  /* Unused pa
d4f0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 63 20  rameter */.  rc 
d500: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
d510: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73  _function(db, "s
d520: 68 61 33 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ha3", 1, SQLITE_
d530: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 20 20 20 73 68 61 33 46 75 6e 63          sha3Func
d560: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
d570: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d580: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d590: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
d5a0: 28 64 62 2c 20 22 73 68 61 33 22 2c 20 32 2c 20  (db, "sha3", 2, 
d5b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 73 68 61 33 46 75 6e 63 2c 20 30 2c 20 30 29   sha3Func, 0, 0)
d5f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
d600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d610: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
d620: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
d630: 2c 20 22 73 68 61 33 5f 71 75 65 72 79 22 2c 20  , "sha3_query", 
d640: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
d650: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 73 68 61 33 51 75 65 72 79 46 75 6e      sha3QueryFun
d680: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
d690: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d6a0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
d6b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
d6c0: 63 74 69 6f 6e 28 64 62 2c 20 22 73 68 61 33 5f  ction(db, "sha3_
d6d0: 71 75 65 72 79 22 2c 20 32 2c 20 53 51 4c 49 54  query", 2, SQLIT
d6e0: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 61 33              sha3
d710: 51 75 65 72 79 46 75 6e 63 2c 20 30 2c 20 30 29  QueryFunc, 0, 0)
d720: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d730: 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
d740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d750: 20 45 6e 64 20 2e 2e 2f 65 78 74 2f 6d 69 73 63   End ../ext/misc
d760: 2f 73 68 61 74 68 72 65 65 2e 63 20 2a 2a 2a 2a  /shathree.c ****
d770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d780: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
d790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
d7a0: 69 6e 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66  in ../ext/misc/f
d7b0: 69 6c 65 69 6f 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a  ileio.c ********
d7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
d7d0: 2a 20 32 30 31 34 2d 30 36 2d 31 33 0a 2a 2a 0a  * 2014-06-13.**.
d7e0: 2a 2a 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  ** The author di
d7f0: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
d800: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
d810: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
d820: 20 6f 66 0a 2a 2a 20 61 20 6c 65 67 61 6c 20 6e   of.** a legal n
d830: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
d840: 20 62 6c 65 73 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a   blessing:.**.**
d850: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
d860: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
d870: 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
d880: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
d890: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
d8a0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
d8b0: 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  ..**    May you 
d8c0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
d8d0: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
d8e0: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 2a  than you give..*
d8f0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
d900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d940: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c 69  .**.** This SQLi
d950: 74 65 20 65 78 74 65 6e 73 69 6f 6e 20 69 6d 70  te extension imp
d960: 6c 65 6d 65 6e 74 73 20 53 51 4c 20 66 75 6e 63  lements SQL func
d970: 74 69 6f 6e 73 20 72 65 61 64 66 69 6c 65 28 29  tions readfile()
d980: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 65 66 69 6c   and.** writefil
d990: 65 28 29 2c 20 61 6e 64 20 65 70 6f 6e 79 6d 6f  e(), and eponymo
d9a0: 75 73 20 76 69 72 74 75 61 6c 20 74 79 70 65 20  us virtual type 
d9b0: 22 66 73 64 69 72 22 2e 0a 2a 2a 0a 2a 2a 20 57  "fsdir"..**.** W
d9c0: 52 49 54 45 46 49 4c 45 28 46 49 4c 45 2c 20 44  RITEFILE(FILE, D
d9d0: 41 54 41 20 5b 2c 20 4d 4f 44 45 20 5b 2c 20 4d  ATA [, MODE [, M
d9e0: 54 49 4d 45 5d 5d 29 3a 0a 2a 2a 0a 2a 2a 20 20  TIME]]):.**.**  
d9f0: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 66 20 74   If neither of t
da00: 68 65 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75  he optional argu
da10: 6d 65 6e 74 73 20 69 73 20 70 72 65 73 65 6e 74  ments is present
da20: 2c 20 74 68 65 6e 20 74 68 69 73 20 55 44 46 0a  , then this UDF.
da30: 2a 2a 20 20 20 66 75 6e 63 74 69 6f 6e 20 77 72  **   function wr
da40: 69 74 65 73 20 62 6c 6f 62 20 44 41 54 41 20 74  ites blob DATA t
da50: 6f 20 66 69 6c 65 20 46 49 4c 45 2e 20 49 66 20  o file FILE. If 
da60: 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20  successful, the 
da70: 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66 20 62  number.**   of b
da80: 79 74 65 73 20 77 72 69 74 74 65 6e 20 69 73 20  ytes written is 
da90: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
daa0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
dab0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
dac0: 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 66  **.**   If the f
dad0: 69 72 73 74 20 6f 70 74 69 6f 6e 20 61 72 67 75  irst option argu
dae0: 6d 65 6e 74 20 2d 20 4d 4f 44 45 20 2d 20 69 73  ment - MODE - is
daf0: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 69   present, then i
db00: 74 20 6d 75 73 74 0a 2a 2a 20 20 20 62 65 20 70  t must.**   be p
db10: 61 73 73 65 64 20 61 6e 20 69 6e 74 65 67 65 72  assed an integer
db20: 20 76 61 6c 75 65 20 74 68 61 74 20 63 6f 72 72   value that corr
db30: 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 50 4f 53  esponds to a POS
db40: 49 58 20 6d 6f 64 65 0a 2a 2a 20 20 20 76 61 6c  IX mode.**   val
db50: 75 65 20 28 66 69 6c 65 20 74 79 70 65 20 2b 20  ue (file type + 
db60: 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 61 73 20  permissions, as 
db70: 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 65 20  returned in the 
db80: 73 74 61 74 2e 73 74 5f 6d 6f 64 65 0a 2a 2a 20  stat.st_mode.** 
db90: 20 20 66 69 65 6c 64 20 62 79 20 74 68 65 20 73    field by the s
dba0: 74 61 74 28 29 20 73 79 73 74 65 6d 20 63 61 6c  tat() system cal
dbb0: 6c 29 2e 20 54 68 72 65 65 20 74 79 70 65 73 20  l). Three types 
dbc0: 6f 66 20 66 69 6c 65 73 20 6d 61 79 0a 2a 2a 20  of files may.** 
dbd0: 20 20 62 65 20 77 72 69 74 74 65 6e 2f 63 72 65    be written/cre
dbe0: 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ated:.**.**     
dbf0: 72 65 67 75 6c 61 72 20 66 69 6c 65 73 3a 20 20  regular files:  
dc00: 28 6d 6f 64 65 20 26 20 30 31 37 30 30 30 30 29  (mode & 0170000)
dc10: 3d 3d 30 31 30 30 30 30 30 0a 2a 2a 20 20 20 20  ==0100000.**    
dc20: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 3a   symbolic links:
dc30: 20 28 6d 6f 64 65 20 26 20 30 31 37 30 30 30 30   (mode & 0170000
dc40: 29 3d 3d 30 31 32 30 30 30 30 0a 2a 2a 20 20 20  )==0120000.**   
dc50: 20 20 64 69 72 65 63 74 6f 72 69 65 73 3a 20 20    directories:  
dc60: 20 20 28 6d 6f 64 65 20 26 20 30 31 37 30 30 30    (mode & 017000
dc70: 30 29 3d 3d 30 30 34 30 30 30 30 0a 2a 2a 0a 2a  0)==0040000.**.*
dc80: 2a 20 20 20 46 6f 72 20 61 20 64 69 72 65 63 74  *   For a direct
dc90: 6f 72 79 2c 20 74 68 65 20 44 41 54 41 20 69 73  ory, the DATA is
dca0: 20 69 67 6e 6f 72 65 64 2e 20 46 6f 72 20 61 20   ignored. For a 
dcb0: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 69  symbolic link, i
dcc0: 74 20 69 73 0a 2a 2a 20 20 20 69 6e 74 65 72 70  t is.**   interp
dcd0: 72 65 74 65 64 20 61 73 20 74 65 78 74 20 61 6e  reted as text an
dce0: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 74 61  d used as the ta
dcf0: 72 67 65 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b  rget of the link
dd00: 2e 20 46 6f 72 20 61 0a 2a 2a 20 20 20 72 65 67  . For a.**   reg
dd10: 75 6c 61 72 20 66 69 6c 65 2c 20 69 74 20 69 73  ular file, it is
dd20: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
dd30: 61 20 62 6c 6f 62 20 61 6e 64 20 77 72 69 74 74  a blob and writt
dd40: 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 20  en into the.**  
dd50: 20 6e 61 6d 65 64 20 66 69 6c 65 2e 20 52 65 67   named file. Reg
dd60: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 74  ardless of the t
dd70: 79 70 65 20 6f 66 20 66 69 6c 65 2c 20 69 74 73  ype of file, its
dd80: 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 72 65   permissions are
dd90: 0a 2a 2a 20 20 20 73 65 74 20 74 6f 20 28 6d 6f  .**   set to (mo
dda0: 64 65 20 26 20 30 37 37 37 29 20 62 65 66 6f 72  de & 0777) befor
ddb0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
ddc0: 2a 2a 20 20 20 49 66 20 74 68 65 20 6f 70 74 69  **   If the opti
ddd0: 6f 6e 61 6c 20 4d 54 49 4d 45 20 61 72 67 75 6d  onal MTIME argum
dde0: 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ent is present, 
ddf0: 74 68 65 6e 20 69 74 20 69 73 20 69 6e 74 65 72  then it is inter
de00: 70 72 65 74 65 64 0a 2a 2a 20 20 20 61 73 20 61  preted.**   as a
de10: 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
de20: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
de30: 73 20 73 69 6e 63 65 20 74 68 65 20 75 6e 69 78  s since the unix
de40: 20 65 70 6f 63 68 2e 20 54 68 65 0a 2a 2a 20 20   epoch. The.**  
de50: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2d 74 69   modification-ti
de60: 6d 65 20 6f 66 20 74 68 65 20 74 61 72 67 65 74  me of the target
de70: 20 66 69 6c 65 20 69 73 20 73 65 74 20 74 6f 20   file is set to 
de80: 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
de90: 65 0a 2a 2a 20 20 20 72 65 74 75 72 6e 69 6e 67  e.**   returning
dea0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 66 20 74 68 72  ..**.**   If thr
deb0: 65 65 20 6f 72 20 6d 6f 72 65 20 61 72 67 75 6d  ee or more argum
dec0: 65 6e 74 73 20 61 72 65 20 70 61 73 73 65 64 20  ents are passed 
ded0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
dee0: 20 61 6e 64 20 61 6e 0a 2a 2a 20 20 20 65 72 72   and an.**   err
def0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
df00: 64 2c 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  d, an exception 
df10: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
df20: 20 52 45 41 44 46 49 4c 45 28 46 49 4c 45 29 3a   READFILE(FILE):
df30: 0a 2a 2a 0a 2a 2a 20 20 20 52 65 61 64 20 61 6e  .**.**   Read an
df40: 64 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6e  d return the con
df50: 74 65 6e 74 73 20 6f 66 20 66 69 6c 65 20 46 49  tents of file FI
df60: 4c 45 20 28 74 79 70 65 20 62 6c 6f 62 29 20 66  LE (type blob) f
df70: 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20  rom disk..**.** 
df80: 46 53 44 49 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 55  FSDIR:.**.**   U
df90: 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  sed as follows:.
dfa0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
dfb0: 20 2a 20 46 52 4f 4d 20 66 73 64 69 72 28 24 70   * FROM fsdir($p
dfc0: 61 74 68 20 5b 2c 20 24 64 69 72 5d 29 3b 0a 2a  ath [, $dir]);.*
dfd0: 2a 0a 2a 2a 20 20 20 50 61 72 61 6d 65 74 65 72  *.**   Parameter
dfe0: 20 24 70 61 74 68 20 69 73 20 61 6e 20 61 62 73   $path is an abs
dff0: 6f 6c 75 74 65 20 6f 72 20 72 65 6c 61 74 69 76  olute or relativ
e000: 65 20 70 61 74 68 6e 61 6d 65 2e 20 49 66 20 74  e pathname. If t
e010: 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 74 0a  he file that it.
e020: 2a 2a 20 20 20 72 65 66 65 72 73 20 74 6f 20 64  **   refers to d
e030: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
e040: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49  t is an error. I
e050: 66 20 74 68 65 20 70 61 74 68 20 72 65 66 65 72  f the path refer
e060: 73 20 74 6f 20 61 20 72 65 67 75 6c 61 72 0a 2a  s to a regular.*
e070: 2a 20 20 20 66 69 6c 65 20 6f 72 20 73 79 6d 62  *   file or symb
e080: 6f 6c 69 63 20 6c 69 6e 6b 2c 20 69 74 20 72 65  olic link, it re
e090: 74 75 72 6e 73 20 61 20 73 69 6e 67 6c 65 20 72  turns a single r
e0a0: 6f 77 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 70  ow. Or, if the p
e0b0: 61 74 68 20 72 65 66 65 72 73 0a 2a 2a 20 20 20  ath refers.**   
e0c0: 74 6f 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  to a directory, 
e0d0: 69 74 20 72 65 74 75 72 6e 73 20 6f 6e 65 20 72  it returns one r
e0e0: 6f 77 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  ow for the direc
e0f0: 74 6f 72 79 2c 20 61 6e 64 20 6f 6e 65 20 72 6f  tory, and one ro
e100: 77 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 20 20  w for each.**   
e110: 66 69 6c 65 20 77 69 74 68 69 6e 20 74 68 65 20  file within the 
e120: 68 69 65 72 61 72 63 68 79 20 72 6f 6f 74 65 64  hierarchy rooted
e130: 20 61 74 20 24 70 61 74 68 2e 0a 2a 2a 0a 2a 2a   at $path..**.**
e140: 20 20 20 45 61 63 68 20 72 6f 77 20 68 61 73 20     Each row has 
e150: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
e160: 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lumns:.**.**    
e170: 20 6e 61 6d 65 3a 20 20 50 61 74 68 20 74 6f 20   name:  Path to 
e180: 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72  file or director
e190: 79 20 28 74 65 78 74 20 76 61 6c 75 65 29 2e 0a  y (text value)..
e1a0: 2a 2a 20 20 20 20 20 6d 6f 64 65 3a 20 20 56 61  **     mode:  Va
e1b0: 6c 75 65 20 6f 66 20 73 74 61 74 2e 73 74 5f 6d  lue of stat.st_m
e1c0: 6f 64 65 20 66 6f 72 20 64 69 72 65 63 74 6f 72  ode for director
e1d0: 79 20 65 6e 74 72 79 20 28 61 6e 20 69 6e 74 65  y entry (an inte
e1e0: 67 65 72 29 2e 0a 2a 2a 20 20 20 20 20 6d 74 69  ger)..**     mti
e1f0: 6d 65 3a 20 56 61 6c 75 65 20 6f 66 20 73 74 61  me: Value of sta
e200: 74 2e 73 74 5f 6d 74 69 6d 65 20 66 6f 72 20 64  t.st_mtime for d
e210: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 28  irectory entry (
e220: 61 6e 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20  an integer)..** 
e230: 20 20 20 20 64 61 74 61 3a 20 20 46 6f 72 20 61      data:  For a
e240: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2c 20 61   regular file, a
e250: 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67   blob containing
e260: 20 74 68 65 20 66 69 6c 65 20 64 61 74 61 2e 20   the file data. 
e270: 46 6f 72 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  For a.**        
e280: 20 20 20 20 73 79 6d 6c 69 6e 6b 2c 20 61 20 74      symlink, a t
e290: 65 78 74 20 76 61 6c 75 65 20 63 6f 6e 74 61 69  ext value contai
e2a0: 6e 69 6e 67 20 74 68 65 20 74 65 78 74 20 6f 66  ning the text of
e2b0: 20 74 68 65 20 6c 69 6e 6b 2e 20 46 6f 72 20 61   the link. For a
e2c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 64  .**            d
e2d0: 69 72 65 63 74 6f 72 79 2c 20 4e 55 4c 4c 2e 0a  irectory, NULL..
e2e0: 2a 2a 0a 2a 2a 20 20 20 49 66 20 61 20 6e 6f 6e  **.**   If a non
e2f0: 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 73  -NULL value is s
e300: 70 65 63 69 66 69 65 64 20 66 6f 72 20 74 68 65  pecified for the
e310: 20 6f 70 74 69 6f 6e 61 6c 20 24 64 69 72 20 70   optional $dir p
e320: 61 72 61 6d 65 74 65 72 20 61 6e 64 0a 2a 2a 20  arameter and.** 
e330: 20 20 24 70 61 74 68 20 69 73 20 61 20 72 65 6c    $path is a rel
e340: 61 74 69 76 65 20 70 61 74 68 2c 20 74 68 65 6e  ative path, then
e350: 20 24 70 61 74 68 20 69 73 20 69 6e 74 65 72 70   $path is interp
e360: 72 65 74 65 64 20 72 65 6c 61 74 69 76 65 20 74  reted relative t
e370: 6f 20 24 64 69 72 2e 20 0a 2a 2a 20 20 20 41 6e  o $dir. .**   An
e380: 64 20 74 68 65 20 70 61 74 68 73 20 72 65 74 75  d the paths retu
e390: 72 6e 65 64 20 69 6e 20 74 68 65 20 22 6e 61 6d  rned in the "nam
e3a0: 65 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  e" column of the
e3b0: 20 74 61 62 6c 65 20 61 72 65 20 61 6c 73 6f 20   table are also 
e3c0: 0a 2a 2a 20 20 20 72 65 6c 61 74 69 76 65 20 74  .**   relative t
e3d0: 6f 20 64 69 72 65 63 74 6f 72 79 20 24 64 69 72  o directory $dir
e3e0: 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 45 58 54 45  ..*/.SQLITE_EXTE
e3f0: 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63  NSION_INIT1.#inc
e400: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
e410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
e420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  h>.#include <ass
e430: 65 72 74 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65  ert.h>..#include
e440: 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23   <sys/types.h>.#
e450: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61  include <sys/sta
e460: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66  t.h>.#include <f
e470: 63 6e 74 6c 2e 68 3e 0a 23 69 66 20 21 64 65 66  cntl.h>.#if !def
e480: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20  ined(_WIN32) && 
e490: 21 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a  !defined(WIN32).
e4a0: 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  #  include <unis
e4b0: 74 64 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  td.h>.#  include
e4c0: 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20 20 69   <dirent.h>.#  i
e4d0: 6e 63 6c 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e  nclude <utime.h>
e4e0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  .#  include <sys
e4f0: 2f 74 69 6d 65 2e 68 3e 0a 23 65 6c 73 65 0a 23  /time.h>.#else.#
e500: 20 20 69 6e 63 6c 75 64 65 20 22 77 69 6e 64 6f    include "windo
e510: 77 73 2e 68 22 0a 23 20 20 69 6e 63 6c 75 64 65  ws.h".#  include
e520: 20 3c 69 6f 2e 68 3e 0a 23 20 20 69 6e 63 6c 75   <io.h>.#  inclu
e530: 64 65 20 3c 64 69 72 65 63 74 2e 68 3e 0a 2f 2a  de <direct.h>./*
e540: 20 23 20 20 69 6e 63 6c 75 64 65 20 22 74 65 73   #  include "tes
e550: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 68 22 20 2a  t_windirent.h" *
e560: 2f 0a 23 20 20 64 65 66 69 6e 65 20 64 69 72 65  /.#  define dire
e570: 6e 74 20 44 49 52 45 4e 54 0a 23 20 20 69 66 6e  nt DIRENT.#  ifn
e580: 64 65 66 20 63 68 6d 6f 64 0a 23 20 20 20 20 64  def chmod.#    d
e590: 65 66 69 6e 65 20 63 68 6d 6f 64 20 5f 63 68 6d  efine chmod _chm
e5a0: 6f 64 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 69  od.#  endif.#  i
e5b0: 66 6e 64 65 66 20 73 74 61 74 0a 23 20 20 20 20  fndef stat.#    
e5c0: 64 65 66 69 6e 65 20 73 74 61 74 20 5f 73 74 61  define stat _sta
e5d0: 74 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65  t.#  endif.#  de
e5e0: 66 69 6e 65 20 6d 6b 64 69 72 28 70 61 74 68 2c  fine mkdir(path,
e5f0: 6d 6f 64 65 29 20 5f 6d 6b 64 69 72 28 70 61 74  mode) _mkdir(pat
e600: 68 29 0a 23 20 20 64 65 66 69 6e 65 20 6c 73 74  h).#  define lst
e610: 61 74 28 70 61 74 68 2c 62 75 66 29 20 73 74 61  at(path,buf) sta
e620: 74 28 70 61 74 68 2c 62 75 66 29 0a 23 65 6e 64  t(path,buf).#end
e630: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  if.#include <tim
e640: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65  e.h>.#include <e
e650: 72 72 6e 6f 2e 68 3e 0a 0a 0a 2f 2a 0a 2a 2a 20  rrno.h>.../*.** 
e660: 53 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65  Structure of the
e670: 20 66 73 64 69 72 28 29 20 74 61 62 6c 65 2d 76   fsdir() table-v
e680: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
e690: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
e6a0: 20 20 20 2f 2a 20 20 20 20 30 20 20 20 20 31 20     /*    0    1 
e6b0: 20 20 20 32 20 20 20 20 20 33 20 20 20 20 34 20     2     3    4 
e6c0: 20 20 20 20 20 20 20 20 20 20 35 20 20 20 20 20            5     
e6d0: 20 20 20 20 20 20 20 20 2a 2f 0a 23 64 65 66 69          */.#defi
e6e0: 6e 65 20 46 53 44 49 52 5f 53 43 48 45 4d 41 20  ne FSDIR_SCHEMA 
e6f0: 22 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d  "(name,mode,mtim
e700: 65 2c 64 61 74 61 2c 70 61 74 68 20 48 49 44 44  e,data,path HIDD
e710: 45 4e 2c 64 69 72 20 48 49 44 44 45 4e 29 22 0a  EN,dir HIDDEN)".
e720: 23 64 65 66 69 6e 65 20 46 53 44 49 52 5f 43 4f  #define FSDIR_CO
e730: 4c 55 4d 4e 5f 4e 41 4d 45 20 20 20 20 20 30 20  LUMN_NAME     0 
e740: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
e750: 68 65 20 66 69 6c 65 20 2a 2f 0a 23 64 65 66 69  he file */.#defi
e760: 6e 65 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e 5f  ne FSDIR_COLUMN_
e770: 4d 4f 44 45 20 20 20 20 20 31 20 20 20 20 20 2f  MODE     1     /
e780: 2a 20 41 63 63 65 73 73 20 6d 6f 64 65 20 2a 2f  * Access mode */
e790: 0a 23 64 65 66 69 6e 65 20 46 53 44 49 52 5f 43  .#define FSDIR_C
e7a0: 4f 4c 55 4d 4e 5f 4d 54 49 4d 45 20 20 20 20 32  OLUMN_MTIME    2
e7b0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6d 6f 64       /* Last mod
e7c0: 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 20 2a  ification time *
e7d0: 2f 0a 23 64 65 66 69 6e 65 20 46 53 44 49 52 5f  /.#define FSDIR_
e7e0: 43 4f 4c 55 4d 4e 5f 44 41 54 41 20 20 20 20 20  COLUMN_DATA     
e7f0: 33 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 63 6f  3     /* File co
e800: 6e 74 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65  ntent */.#define
e810: 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e 5f 50 41   FSDIR_COLUMN_PA
e820: 54 48 20 20 20 20 20 34 20 20 20 20 20 2f 2a 20  TH     4     /* 
e830: 50 61 74 68 20 74 6f 20 74 6f 70 20 6f 66 20 73  Path to top of s
e840: 65 61 72 63 68 20 2a 2f 0a 23 64 65 66 69 6e 65  earch */.#define
e850: 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e 5f 44 49   FSDIR_COLUMN_DI
e860: 52 20 20 20 20 20 20 35 20 20 20 20 20 2f 2a 20  R      5     /* 
e870: 50 61 74 68 20 69 73 20 72 65 6c 61 74 69 76 65  Path is relative
e880: 20 74 6f 20 74 68 69 73 20 64 69 72 65 63 74 6f   to this directo
e890: 72 79 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  ry */.../*.** Se
e8a0: 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 74 6f  t the result sto
e8b0: 72 65 64 20 62 79 20 63 6f 6e 74 65 78 74 20 63  red by context c
e8c0: 74 78 20 74 6f 20 61 20 62 6c 6f 62 20 63 6f 6e  tx to a blob con
e8d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 0a 2a 2a 20  taining the .** 
e8e0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 66 69 6c 65  contents of file
e8f0: 20 7a 4e 61 6d 65 2e 20 20 4f 72 2c 20 6c 65 61   zName.  Or, lea
e900: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 75 6e  ve the result un
e910: 63 68 61 6e 67 65 64 20 28 4e 55 4c 4c 29 0a 2a  changed (NULL).*
e920: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  * if the file do
e930: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
e940: 69 73 20 75 6e 72 65 61 64 61 62 6c 65 2e 0a 2a  is unreadable..*
e950: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
e960: 20 65 78 63 65 65 64 73 20 74 68 65 20 53 51 4c   exceeds the SQL
e970: 69 74 65 20 62 6c 6f 62 20 73 69 7a 65 20 6c 69  ite blob size li
e980: 6d 69 74 2c 20 74 68 72 6f 75 67 68 20 61 6e 0a  mit, through an.
e990: 2a 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  ** SQLITE_TOOBIG
e9a0: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
e9b0: 72 6f 77 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  row an SQLITE_IO
e9c0: 45 52 52 20 69 66 20 74 68 65 72 65 20 61 72 65  ERR if there are
e9d0: 20 64 69 66 66 69 63 75 6c 74 69 65 73 20 70 75   difficulties pu
e9e0: 6c 6c 69 6e 67 20 74 68 65 20 66 69 6c 65 0a 2a  lling the file.*
e9f0: 2a 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 0a 2a  * off of disk..*
ea00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
ea10: 61 64 46 69 6c 65 43 6f 6e 74 65 6e 74 73 28 73  adFileContents(s
ea20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ea30: 63 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ctx, const char 
ea40: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20  *zName){.  FILE 
ea50: 2a 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  *in;.  sqlite3_i
ea60: 6e 74 36 34 20 6e 49 6e 3b 0a 20 20 76 6f 69 64  nt64 nIn;.  void
ea70: 20 2a 70 42 75 66 3b 0a 20 20 73 71 6c 69 74 65   *pBuf;.  sqlite
ea80: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 78 42  3 *db;.  int mxB
ea90: 6c 6f 62 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f 70  lob;..  in = fop
eaa0: 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
eab0: 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
eac0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 6f 65 73      /* File does
ead0: 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73   not exist or is
eae0: 20 75 6e 72 65 61 64 61 62 6c 65 2e 20 4c 65 61   unreadable. Lea
eaf0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ve the result se
eb00: 74 20 74 6f 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  t to NULL. */.  
eb10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
eb20: 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45  fseek(in, 0, SEE
eb30: 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20  K_END);.  nIn = 
eb40: 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77  ftell(in);.  rew
eb50: 69 6e 64 28 69 6e 29 3b 0a 20 20 64 62 20 3d 20  ind(in);.  db = 
eb60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
eb70: 64 62 5f 68 61 6e 64 6c 65 28 63 74 78 29 3b 0a  db_handle(ctx);.
eb80: 20 20 6d 78 42 6c 6f 62 20 3d 20 73 71 6c 69 74    mxBlob = sqlit
eb90: 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
eba0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
ebb0: 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 6e 49 6e  , -1);.  if( nIn
ebc0: 3e 6d 78 42 6c 6f 62 20 29 7b 0a 20 20 20 20 73  >mxBlob ){.    s
ebd0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
ebe0: 72 6f 72 5f 63 6f 64 65 28 63 74 78 2c 20 53 51  ror_code(ctx, SQ
ebf0: 4c 49 54 45 5f 54 4f 4f 42 49 47 29 3b 0a 20 20  LITE_TOOBIG);.  
ec00: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
ec10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
ec20: 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
ec30: 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 20 29 3b 0a  alloc64( nIn );.
ec40: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
ec50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
ec60: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
ec70: 63 74 78 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  ctx);.    fclose
ec80: 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (in);.    return
ec90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 31 3d 3d 66  ;.  }.  if( 1==f
eca0: 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20  read(pBuf, nIn, 
ecb0: 31 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 73 71  1, in) ){.    sq
ecc0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
ecd0: 62 36 34 28 63 74 78 2c 20 70 42 75 66 2c 20 6e  b64(ctx, pBuf, n
ece0: 49 6e 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  In, sqlite3_free
ecf0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ed00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
ed10: 72 72 6f 72 5f 63 6f 64 65 28 63 74 78 2c 20 53  rror_code(ctx, S
ed20: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
ed30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ed40: 42 75 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  Buf);.  }.  fclo
ed50: 73 65 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se(in);.}../*.**
ed60: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
ed70: 6f 66 20 74 68 65 20 22 72 65 61 64 66 69 6c 65  of the "readfile
ed80: 28 58 29 22 20 53 51 4c 20 66 75 6e 63 74 69 6f  (X)" SQL functio
ed90: 6e 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 63  n.  The entire c
eda0: 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65  ontent.** of the
edb0: 20 66 69 6c 65 20 6e 61 6d 65 64 20 58 20 69 73   file named X is
edc0: 20 72 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e   read and return
edd0: 65 64 20 61 73 20 61 20 42 4c 4f 42 2e 20 20 4e  ed as a BLOB.  N
ede0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ULL is returned.
edf0: 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  ** if the file d
ee00: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
ee10: 20 69 73 20 75 6e 72 65 61 64 61 62 6c 65 2e 0a   is unreadable..
ee20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
ee30: 65 61 64 66 69 6c 65 46 75 6e 63 28 0a 20 20 73  eadfileFunc(.  s
ee40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ee50: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
ee60: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
ee70: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
ee80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ee90: 6d 65 3b 0a 20 20 28 76 6f 69 64 29 28 61 72 67  me;.  (void)(arg
eea0: 63 29 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70  c);  /* Unused p
eeb0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 7a 4e  arameter */.  zN
eec0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
eed0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
eee0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
eef0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
ef00: 20 72 65 74 75 72 6e 3b 0a 20 20 72 65 61 64 46   return;.  readF
ef10: 69 6c 65 43 6f 6e 74 65 6e 74 73 28 63 6f 6e 74  ileContents(cont
ef20: 65 78 74 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a  ext, zName);.}..
ef30: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 65 72  /*.** Set the er
ef40: 72 6f 72 20 6d 65 73 73 61 67 65 20 63 6f 6e 74  ror message cont
ef50: 61 69 6e 65 64 20 69 6e 20 63 6f 6e 74 65 78 74  ained in context
ef60: 20 63 74 78 20 74 6f 20 74 68 65 20 72 65 73 75   ctx to the resu
ef70: 6c 74 73 20 6f 66 0a 2a 2a 20 76 70 72 69 6e 74  lts of.** vprint
ef80: 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29 2e 0a 2a 2f  f(zFmt, ...)..*/
ef90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 74 78  .static void ctx
efa0: 45 72 72 6f 72 4d 73 67 28 73 71 6c 69 74 65 33  ErrorMsg(sqlite3
efb0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 63  _context *ctx, c
efc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
efd0: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
efe0: 4d 73 67 20 3d 20 30 3b 0a 20 20 76 61 5f 6c 69  Msg = 0;.  va_li
eff0: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
f000: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a  t(ap, zFmt);.  z
f010: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Msg = sqlite3_vm
f020: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
f030: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
f040: 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 7a 4d  lt_error(ctx, zM
f050: 73 67 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  sg, -1);.  sqlit
f060: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
f070: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
f080: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
f090: 33 32 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  32)./*.** This f
f0a0: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 73 69 67  unction is desig
f0b0: 6e 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  ned to convert a
f0c0: 20 57 69 6e 33 32 20 46 49 4c 45 54 49 4d 45 20   Win32 FILETIME 
f0d0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 74  structure into t
f0e0: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
f0f0: 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
f100: 65 20 55 6e 69 78 20 45 70 6f 63 68 20 28 31 39  e Unix Epoch (19
f110: 37 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a 30  70-01-01 00:00:0
f120: 30 20 55 54 43 29 2e 0a 2a 2f 0a 73 74 61 74 69  0 UTC)..*/.stati
f130: 63 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34  c sqlite3_uint64
f140: 20 66 69 6c 65 54 69 6d 65 54 6f 55 6e 69 78 54   fileTimeToUnixT
f150: 69 6d 65 28 0a 20 20 4c 50 46 49 4c 45 54 49 4d  ime(.  LPFILETIM
f160: 45 20 70 46 69 6c 65 54 69 6d 65 0a 29 7b 0a 20  E pFileTime.){. 
f170: 20 53 59 53 54 45 4d 54 49 4d 45 20 65 70 6f 63   SYSTEMTIME epoc
f180: 68 53 79 73 74 65 6d 54 69 6d 65 3b 0a 20 20 55  hSystemTime;.  U
f190: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 65 70  LARGE_INTEGER ep
f1a0: 6f 63 68 49 6e 74 65 72 76 61 6c 73 3b 0a 20 20  ochIntervals;.  
f1b0: 46 49 4c 45 54 49 4d 45 20 65 70 6f 63 68 46 69  FILETIME epochFi
f1c0: 6c 65 54 69 6d 65 3b 0a 20 20 55 4c 41 52 47 45  leTime;.  ULARGE
f1d0: 5f 49 4e 54 45 47 45 52 20 66 69 6c 65 49 6e 74  _INTEGER fileInt
f1e0: 65 72 76 61 6c 73 3b 0a 0a 20 20 6d 65 6d 73 65  ervals;..  memse
f1f0: 74 28 26 65 70 6f 63 68 53 79 73 74 65 6d 54 69  t(&epochSystemTi
f200: 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59  me, 0, sizeof(SY
f210: 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20 20 65 70  STEMTIME));.  ep
f220: 6f 63 68 53 79 73 74 65 6d 54 69 6d 65 2e 77 59  ochSystemTime.wY
f230: 65 61 72 20 3d 20 31 39 37 30 3b 0a 20 20 65 70  ear = 1970;.  ep
f240: 6f 63 68 53 79 73 74 65 6d 54 69 6d 65 2e 77 4d  ochSystemTime.wM
f250: 6f 6e 74 68 20 3d 20 31 3b 0a 20 20 65 70 6f 63  onth = 1;.  epoc
f260: 68 53 79 73 74 65 6d 54 69 6d 65 2e 77 44 61 79  hSystemTime.wDay
f270: 20 3d 20 31 3b 0a 20 20 53 79 73 74 65 6d 54 69   = 1;.  SystemTi
f280: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 65 70  meToFileTime(&ep
f290: 6f 63 68 53 79 73 74 65 6d 54 69 6d 65 2c 20 26  ochSystemTime, &
f2a0: 65 70 6f 63 68 46 69 6c 65 54 69 6d 65 29 3b 0a  epochFileTime);.
f2b0: 20 20 65 70 6f 63 68 49 6e 74 65 72 76 61 6c 73    epochIntervals
f2c0: 2e 4c 6f 77 50 61 72 74 20 3d 20 65 70 6f 63 68  .LowPart = epoch
f2d0: 46 69 6c 65 54 69 6d 65 2e 64 77 4c 6f 77 44 61  FileTime.dwLowDa
f2e0: 74 65 54 69 6d 65 3b 0a 20 20 65 70 6f 63 68 49  teTime;.  epochI
f2f0: 6e 74 65 72 76 61 6c 73 2e 48 69 67 68 50 61 72  ntervals.HighPar
f300: 74 20 3d 20 65 70 6f 63 68 46 69 6c 65 54 69 6d  t = epochFileTim
f310: 65 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  e.dwHighDateTime
f320: 3b 0a 0a 20 20 66 69 6c 65 49 6e 74 65 72 76 61  ;..  fileInterva
f330: 6c 73 2e 4c 6f 77 50 61 72 74 20 3d 20 70 46 69  ls.LowPart = pFi
f340: 6c 65 54 69 6d 65 2d 3e 64 77 4c 6f 77 44 61 74  leTime->dwLowDat
f350: 65 54 69 6d 65 3b 0a 20 20 66 69 6c 65 49 6e 74  eTime;.  fileInt
f360: 65 72 76 61 6c 73 2e 48 69 67 68 50 61 72 74 20  ervals.HighPart 
f370: 3d 20 70 46 69 6c 65 54 69 6d 65 2d 3e 64 77 48  = pFileTime->dwH
f380: 69 67 68 44 61 74 65 54 69 6d 65 3b 0a 0a 20 20  ighDateTime;..  
f390: 72 65 74 75 72 6e 20 28 66 69 6c 65 49 6e 74 65  return (fileInte
f3a0: 72 76 61 6c 73 2e 51 75 61 64 50 61 72 74 20 2d  rvals.QuadPart -
f3b0: 20 65 70 6f 63 68 49 6e 74 65 72 76 61 6c 73 2e   epochIntervals.
f3c0: 51 75 61 64 50 61 72 74 29 20 2f 20 31 30 30 30  QuadPart) / 1000
f3d0: 30 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  0000;.}../*.** T
f3e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
f3f0: 65 6d 70 74 73 20 74 6f 20 6e 6f 72 6d 61 6c 69  empts to normali
f400: 7a 65 20 74 68 65 20 74 69 6d 65 20 76 61 6c 75  ze the time valu
f410: 65 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  es found in the 
f420: 73 74 61 74 28 29 0a 2a 2a 20 62 75 66 66 65 72  stat().** buffer
f430: 20 74 6f 20 55 54 43 2e 20 20 54 68 69 73 20 69   to UTC.  This i
f440: 73 20 6e 65 63 65 73 73 61 72 79 20 6f 6e 20 57  s necessary on W
f450: 69 6e 33 32 2c 20 77 68 65 72 65 20 74 68 65 20  in32, where the 
f460: 72 75 6e 74 69 6d 65 20 6c 69 62 72 61 72 79 0a  runtime library.
f470: 2a 2a 20 61 70 70 65 61 72 73 20 74 6f 20 72 65  ** appears to re
f480: 74 75 72 6e 20 74 68 65 73 65 20 76 61 6c 75 65  turn these value
f490: 73 20 61 73 20 6c 6f 63 61 6c 20 74 69 6d 65 73  s as local times
f4a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f4b0: 20 73 74 61 74 54 69 6d 65 73 54 6f 55 74 63 28   statTimesToUtc(
f4c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f4d0: 50 61 74 68 2c 0a 20 20 73 74 72 75 63 74 20 73  Path,.  struct s
f4e0: 74 61 74 20 2a 70 53 74 61 74 42 75 66 0a 29 7b  tat *pStatBuf.){
f4f0: 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 46  .  HANDLE hFindF
f500: 69 6c 65 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e  ile;.  WIN32_FIN
f510: 44 5f 44 41 54 41 57 20 66 64 3b 0a 20 20 4c 50  D_DATAW fd;.  LP
f520: 57 53 54 52 20 7a 55 6e 69 63 6f 64 65 4e 61 6d  WSTR zUnicodeNam
f530: 65 3b 0a 20 20 65 78 74 65 72 6e 20 4c 50 57 53  e;.  extern LPWS
f540: 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  TR sqlite3_win32
f550: 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65  _utf8_to_unicode
f560: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  (const char*);. 
f570: 20 7a 55 6e 69 63 6f 64 65 4e 61 6d 65 20 3d 20   zUnicodeName = 
f580: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
f590: 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 50  f8_to_unicode(zP
f5a0: 61 74 68 29 3b 0a 20 20 69 66 28 20 7a 55 6e 69  ath);.  if( zUni
f5b0: 63 6f 64 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  codeName ){.    
f5c0: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
f5d0: 69 7a 65 6f 66 28 57 49 4e 33 32 5f 46 49 4e 44  izeof(WIN32_FIND
f5e0: 5f 44 41 54 41 57 29 29 3b 0a 20 20 20 20 68 46  _DATAW));.    hF
f5f0: 69 6e 64 46 69 6c 65 20 3d 20 46 69 6e 64 46 69  indFile = FindFi
f600: 72 73 74 46 69 6c 65 57 28 7a 55 6e 69 63 6f 64  rstFileW(zUnicod
f610: 65 4e 61 6d 65 2c 20 26 66 64 29 3b 0a 20 20 20  eName, &fd);.   
f620: 20 69 66 28 20 68 46 69 6e 64 46 69 6c 65 21 3d   if( hFindFile!=
f630: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 53  NULL ){.      pS
f640: 74 61 74 42 75 66 2d 3e 73 74 5f 63 74 69 6d 65  tatBuf->st_ctime
f650: 20 3d 20 28 74 69 6d 65 5f 74 29 66 69 6c 65 54   = (time_t)fileT
f660: 69 6d 65 54 6f 55 6e 69 78 54 69 6d 65 28 26 66  imeToUnixTime(&f
f670: 64 2e 66 74 43 72 65 61 74 69 6f 6e 54 69 6d 65  d.ftCreationTime
f680: 29 3b 0a 20 20 20 20 20 20 70 53 74 61 74 42 75  );.      pStatBu
f690: 66 2d 3e 73 74 5f 61 74 69 6d 65 20 3d 20 28 74  f->st_atime = (t
f6a0: 69 6d 65 5f 74 29 66 69 6c 65 54 69 6d 65 54 6f  ime_t)fileTimeTo
f6b0: 55 6e 69 78 54 69 6d 65 28 26 66 64 2e 66 74 4c  UnixTime(&fd.ftL
f6c0: 61 73 74 41 63 63 65 73 73 54 69 6d 65 29 3b 0a  astAccessTime);.
f6d0: 20 20 20 20 20 20 70 53 74 61 74 42 75 66 2d 3e        pStatBuf->
f6e0: 73 74 5f 6d 74 69 6d 65 20 3d 20 28 74 69 6d 65  st_mtime = (time
f6f0: 5f 74 29 66 69 6c 65 54 69 6d 65 54 6f 55 6e 69  _t)fileTimeToUni
f700: 78 54 69 6d 65 28 26 66 64 2e 66 74 4c 61 73 74  xTime(&fd.ftLast
f710: 57 72 69 74 65 54 69 6d 65 29 3b 0a 20 20 20 20  WriteTime);.    
f720: 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e    FindClose(hFin
f730: 64 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  dFile);.    }.  
f740: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f750: 55 6e 69 63 6f 64 65 4e 61 6d 65 29 3b 0a 20 20  UnicodeName);.  
f760: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
f770: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f780: 69 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  is used in place
f790: 20 6f 66 20 73 74 61 74 28 29 2e 20 20 4f 6e 20   of stat().  On 
f7a0: 57 69 6e 64 6f 77 73 2c 20 73 70 65 63 69 61 6c  Windows, special
f7b0: 20 68 61 6e 64 6c 69 6e 67 0a 2a 2a 20 69 73 20   handling.** is 
f7c0: 72 65 71 75 69 72 65 64 20 69 6e 20 6f 72 64 65  required in orde
f7d0: 72 20 66 6f 72 20 74 68 65 20 69 6e 63 6c 75 64  r for the includ
f7e0: 65 64 20 74 69 6d 65 20 74 6f 20 62 65 20 72 65  ed time to be re
f7f0: 74 75 72 6e 65 64 20 61 73 20 55 54 43 2e 20 20  turned as UTC.  
f800: 4f 6e 20 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20  On all.** other 
f810: 73 79 73 74 65 6d 73 2c 20 74 68 69 73 20 66 75  systems, this fu
f820: 6e 63 74 69 6f 6e 20 73 69 6d 70 6c 79 20 63 61  nction simply ca
f830: 6c 6c 73 20 73 74 61 74 28 29 2e 0a 2a 2f 0a 73  lls stat()..*/.s
f840: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 53 74  tatic int fileSt
f850: 61 74 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  at(.  const char
f860: 20 2a 7a 50 61 74 68 2c 0a 20 20 73 74 72 75 63   *zPath,.  struc
f870: 74 20 73 74 61 74 20 2a 70 53 74 61 74 42 75 66  t stat *pStatBuf
f880: 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .){.#if defined(
f890: 5f 57 49 4e 33 32 29 0a 20 20 69 6e 74 20 72 63  _WIN32).  int rc
f8a0: 20 3d 20 73 74 61 74 28 7a 50 61 74 68 2c 20 70   = stat(zPath, p
f8b0: 53 74 61 74 42 75 66 29 3b 0a 20 20 69 66 28 20  StatBuf);.  if( 
f8c0: 72 63 3d 3d 30 20 29 20 73 74 61 74 54 69 6d 65  rc==0 ) statTime
f8d0: 73 54 6f 55 74 63 28 7a 50 61 74 68 2c 20 70 53  sToUtc(zPath, pS
f8e0: 74 61 74 42 75 66 29 3b 0a 20 20 72 65 74 75 72  tatBuf);.  retur
f8f0: 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 72 65  n rc;.#else.  re
f900: 74 75 72 6e 20 73 74 61 74 28 7a 50 61 74 68 2c  turn stat(zPath,
f910: 20 70 53 74 61 74 42 75 66 29 3b 0a 23 65 6e 64   pStatBuf);.#end
f920: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  if.}../*.** This
f930: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
f940: 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 6c 73  d in place of ls
f950: 74 61 74 28 29 2e 20 20 4f 6e 20 57 69 6e 64 6f  tat().  On Windo
f960: 77 73 2c 20 73 70 65 63 69 61 6c 20 68 61 6e 64  ws, special hand
f970: 6c 69 6e 67 0a 2a 2a 20 69 73 20 72 65 71 75 69  ling.** is requi
f980: 72 65 64 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  red in order for
f990: 20 74 68 65 20 69 6e 63 6c 75 64 65 64 20 74 69   the included ti
f9a0: 6d 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  me to be returne
f9b0: 64 20 61 73 20 55 54 43 2e 20 20 4f 6e 20 61 6c  d as UTC.  On al
f9c0: 6c 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65  l.** other syste
f9d0: 6d 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ms, this functio
f9e0: 6e 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 6c  n simply calls l
f9f0: 73 74 61 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  stat()..*/.stati
fa00: 63 20 69 6e 74 20 66 69 6c 65 4c 69 6e 6b 53 74  c int fileLinkSt
fa10: 61 74 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  at(.  const char
fa20: 20 2a 7a 50 61 74 68 2c 0a 20 20 73 74 72 75 63   *zPath,.  struc
fa30: 74 20 73 74 61 74 20 2a 70 53 74 61 74 42 75 66  t stat *pStatBuf
fa40: 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .){.#if defined(
fa50: 5f 57 49 4e 33 32 29 0a 20 20 69 6e 74 20 72 63  _WIN32).  int rc
fa60: 20 3d 20 6c 73 74 61 74 28 7a 50 61 74 68 2c 20   = lstat(zPath, 
fa70: 70 53 74 61 74 42 75 66 29 3b 0a 20 20 69 66 28  pStatBuf);.  if(
fa80: 20 72 63 3d 3d 30 20 29 20 73 74 61 74 54 69 6d   rc==0 ) statTim
fa90: 65 73 54 6f 55 74 63 28 7a 50 61 74 68 2c 20 70  esToUtc(zPath, p
faa0: 53 74 61 74 42 75 66 29 3b 0a 20 20 72 65 74 75  StatBuf);.  retu
fab0: 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 72  rn rc;.#else.  r
fac0: 65 74 75 72 6e 20 6c 73 74 61 74 28 7a 50 61 74  eturn lstat(zPat
fad0: 68 2c 20 70 53 74 61 74 42 75 66 29 3b 0a 23 65  h, pStatBuf);.#e
fae0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  ndif.}../*.** Ar
faf0: 67 75 6d 65 6e 74 20 7a 46 69 6c 65 20 69 73 20  gument zFile is 
fb00: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69  the name of a fi
fb10: 6c 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  le that will be 
fb20: 63 72 65 61 74 65 64 20 61 6e 64 2f 6f 72 20 77  created and/or w
fb30: 72 69 74 74 65 6e 0a 2a 2a 20 62 79 20 53 51 4c  ritten.** by SQL
fb40: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 66   function writef
fb50: 69 6c 65 28 29 2e 20 54 68 69 73 20 66 75 6e 63  ile(). This func
fb60: 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74 68 61  tion ensures tha
fb70: 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  t the directory.
fb80: 2a 2a 20 7a 46 69 6c 65 20 77 69 6c 6c 20 62 65  ** zFile will be
fb90: 20 77 72 69 74 74 65 6e 20 74 6f 20 65 78 69 73   written to exis
fba0: 74 73 2c 20 63 72 65 61 74 69 6e 67 20 69 74 20  ts, creating it 
fbb0: 69 66 20 72 65 71 75 69 72 65 64 2e 20 54 68 65  if required. The
fbc0: 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
fbd0: 66 6f 72 20 61 6e 79 20 70 61 74 68 20 63 6f 6d  for any path com
fbe0: 70 6f 6e 65 6e 74 73 20 63 72 65 61 74 65 64 20  ponents created 
fbf0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
fc00: 20 61 72 65 20 73 65 74 20 74 6f 20 28 6d 6f 64   are set to (mod
fc10: 65 26 30 37 37 37 29 2e 0a 2a 2a 0a 2a 2a 20 49  e&0777)..**.** I
fc20: 66 20 61 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69  f an OOM conditi
fc30: 6f 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  on is encountere
fc40: 64 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  d, SQLITE_NOMEM 
fc50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
fc60: 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
fc70: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
fc80: 20 69 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   if the director
fc90: 79 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  y is successfull
fca0: 79 20 63 72 65 61 74 65 64 2c 20 6f 72 0a 2a 2a  y created, or.**
fcb0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 6f 74   SQLITE_ERROR ot
fcc0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
fcd0: 69 63 20 69 6e 74 20 6d 61 6b 65 44 69 72 65 63  ic int makeDirec
fce0: 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68  tory(.  const ch
fcf0: 61 72 20 2a 7a 46 69 6c 65 2c 0a 20 20 6d 6f 64  ar *zFile,.  mod
fd00: 65 5f 74 20 6d 6f 64 65 0a 29 7b 0a 20 20 63 68  e_t mode.){.  ch
fd10: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 73 71 6c 69  ar *zCopy = sqli
fd20: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
fd30: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 69 6e 74 20  , zFile);.  int 
fd40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fd50: 0a 20 20 69 66 28 20 7a 43 6f 70 79 3d 3d 30 20  .  if( zCopy==0 
fd60: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
fd70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
fd80: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  e{.    int nCopy
fd90: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
fda0: 43 6f 70 79 29 3b 0a 20 20 20 20 69 6e 74 20 69  Copy);.    int i
fdb0: 20 3d 20 31 3b 0a 0a 20 20 20 20 77 68 69 6c 65   = 1;..    while
fdc0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fdd0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
fde0: 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20  stat sStat;.    
fdf0: 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
fe00: 20 20 66 6f 72 28 3b 20 7a 43 6f 70 79 5b 69 5d    for(; zCopy[i]
fe10: 21 3d 27 2f 27 20 26 26 20 69 3c 6e 43 6f 70 79  !='/' && i<nCopy
fe20: 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  ; i++);.      if
fe30: 28 20 69 3d 3d 6e 43 6f 70 79 20 29 20 62 72 65  ( i==nCopy ) bre
fe40: 61 6b 3b 0a 20 20 20 20 20 20 7a 43 6f 70 79 5b  ak;.      zCopy[
fe50: 69 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  i] = '\0';..    
fe60: 20 20 72 63 32 20 3d 20 66 69 6c 65 53 74 61 74    rc2 = fileStat
fe70: 28 7a 43 6f 70 79 2c 20 26 73 53 74 61 74 29 3b  (zCopy, &sStat);
fe80: 0a 20 20 20 20 20 20 69 66 28 20 72 63 32 21 3d  .      if( rc2!=
fe90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
fea0: 20 6d 6b 64 69 72 28 7a 43 6f 70 79 2c 20 6d 6f   mkdir(zCopy, mo
feb0: 64 65 20 26 20 30 37 37 37 29 20 29 20 72 63 20  de & 0777) ) rc 
fec0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
fed0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fee0: 20 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49       if( !S_ISDI
fef0: 52 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29  R(sStat.st_mode)
ff00: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
ff10: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
ff20: 20 20 20 20 7a 43 6f 70 79 5b 69 5d 20 3d 20 27      zCopy[i] = '
ff30: 2f 27 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20  /';.      i++;. 
ff40: 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
ff50: 33 5f 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20  3_free(zCopy);. 
ff60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
ff70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
ff80: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
ff90: 20 77 6f 72 6b 20 66 6f 72 20 74 68 65 20 77 72   work for the wr
ffa0: 69 74 65 66 69 6c 65 28 29 20 55 44 46 2e 20 52  itefile() UDF. R
ffb0: 65 66 65 72 20 74 6f 20 0a 2a 2a 20 68 65 61 64  efer to .** head
ffc0: 65 72 20 63 6f 6d 6d 65 6e 74 73 20 61 74 20 74  er comments at t
ffd0: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
ffe0: 69 6c 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ile for details.
fff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10000 72 69 74 65 46 69 6c 65 28 0a 20 20 73 71 6c 69  riteFile(.  sqli
10010 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
10020 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  x,          /* C
10030 6f 6e 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e  ontext to return
10040 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69   bytes written i
10050 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
10060 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  r *zFile,       
10070 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
10080 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
10090 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44 61 74  ite3_value *pDat
100a0 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
100b0 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
100c0 0a 20 20 6d 6f 64 65 5f 74 20 6d 6f 64 65 2c 20  .  mode_t mode, 
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 2f 2a 20 4d 4f 44 45 20 70 61 72 61 6d     /* MODE param
100f0 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 77  eter passed to w
10100 72 69 74 65 66 69 6c 65 28 29 20 2a 2f 0a 20 20  ritefile() */.  
10110 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 74  sqlite3_int64 mt
10120 69 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ime             
10130 2f 2a 20 4d 54 49 4d 45 20 70 61 72 61 6d 65 74  /* MTIME paramet
10140 65 72 20 28 6f 72 20 2d 31 20 74 6f 20 6e 6f 74  er (or -1 to not
10150 20 73 65 74 20 74 69 6d 65 29 20 2a 2f 0a 29 7b   set time) */.){
10160 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57  .#if !defined(_W
10170 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65  IN32) && !define
10180 64 28 57 49 4e 33 32 29 0a 20 20 69 66 28 20 53  d(WIN32).  if( S
10190 5f 49 53 4c 4e 4b 28 6d 6f 64 65 29 20 29 7b 0a  _ISLNK(mode) ){.
101a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
101b0 7a 54 6f 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zTo = (const cha
101c0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
101d0 5f 74 65 78 74 28 70 44 61 74 61 29 3b 0a 20 20  _text(pData);.  
101e0 20 20 69 66 28 20 73 79 6d 6c 69 6e 6b 28 7a 54    if( symlink(zT
101f0 6f 2c 20 7a 46 69 6c 65 29 3c 30 20 29 20 72 65  o, zFile)<0 ) re
10200 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 0a  turn 1;.  }else.
10210 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
10220 66 28 20 53 5f 49 53 44 49 52 28 6d 6f 64 65 29  f( S_ISDIR(mode)
10230 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 6b   ){.      if( mk
10240 64 69 72 28 7a 46 69 6c 65 2c 20 6d 6f 64 65 29  dir(zFile, mode)
10250 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
10260 68 65 20 6d 6b 64 69 72 28 29 20 63 61 6c 6c 20  he mkdir() call 
10270 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 64 69  to create the di
10280 72 65 63 74 6f 72 79 20 66 61 69 6c 65 64 2e 20  rectory failed. 
10290 54 68 69 73 20 6d 69 67 68 74 20 6e 6f 74 0a 20  This might not. 
102a0 20 20 20 20 20 20 20 2a 2a 20 62 65 20 61 6e 20         ** be an 
102b0 65 72 72 6f 72 20 74 68 6f 75 67 68 20 2d 20 69  error though - i
102c0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
102d0 64 79 20 61 20 64 69 72 65 63 74 6f 72 79 20 61  dy a directory a
102e0 74 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  t the same.     
102f0 20 20 20 2a 2a 20 70 61 74 68 20 61 6e 64 20 65     ** path and e
10300 69 74 68 65 72 20 74 68 65 20 70 65 72 6d 69 73  ither the permis
10310 73 69 6f 6e 73 20 61 6c 72 65 61 64 79 20 6d 61  sions already ma
10320 74 63 68 20 6f 72 20 63 61 6e 20 62 65 20 63 68  tch or can be ch
10330 61 6e 67 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  anged.        **
10340 20 74 6f 20 64 6f 20 73 6f 20 75 73 69 6e 67 20   to do so using 
10350 63 68 6d 6f 64 28 29 2c 20 69 74 20 69 73 20 6e  chmod(), it is n
10360 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f  ot an error.  */
10370 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
10380 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20 20 20  stat sStat;.    
10390 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45      if( errno!=E
103a0 45 58 49 53 54 0a 20 20 20 20 20 20 20 20 20 7c  EXIST.         |
103b0 7c 20 30 21 3d 66 69 6c 65 53 74 61 74 28 7a 46  | 0!=fileStat(zF
103c0 69 6c 65 2c 20 26 73 53 74 61 74 29 0a 20 20 20  ile, &sStat).   
103d0 20 20 20 20 20 20 7c 7c 20 21 53 5f 49 53 44 49        || !S_ISDI
103e0 52 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 29  R(sStat.st_mode)
103f0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 73  .         || ((s
10400 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37  Stat.st_mode&077
10410 37 29 21 3d 28 6d 6f 64 65 26 30 37 37 37 29 20  7)!=(mode&0777) 
10420 26 26 20 30 21 3d 63 68 6d 6f 64 28 7a 46 69 6c  && 0!=chmod(zFil
10430 65 2c 20 6d 6f 64 65 26 30 37 37 37 29 29 0a 20  e, mode&0777)). 
10440 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
10450 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10480 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
10490 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  Write = 0;.     
104a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
104b0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30        int rc = 0
104c0 3b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a 6f 75  ;.      FILE *ou
104d0 74 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c  t = fopen(zFile,
104e0 20 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69 66   "wb");.      if
104f0 28 20 6f 75 74 3d 3d 30 20 29 20 72 65 74 75 72  ( out==0 ) retur
10500 6e 20 31 3b 0a 20 20 20 20 20 20 7a 20 3d 20 28  n 1;.      z = (
10510 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10520 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
10530 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
10540 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71   z ){.        sq
10550 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20  lite3_int64 n = 
10560 66 77 72 69 74 65 28 7a 2c 20 31 2c 20 73 71 6c  fwrite(z, 1, sql
10570 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
10580 28 70 44 61 74 61 29 2c 20 6f 75 74 29 3b 0a 20  (pData), out);. 
10590 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
105a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
105b0 74 65 73 28 70 44 61 74 61 29 3b 0a 20 20 20 20  tes(pData);.    
105c0 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d      if( nWrite!=
105d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  n ){.          r
105e0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
105f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
10600 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
10610 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 6d    if( rc==0 && m
10620 6f 64 65 20 26 26 20 63 68 6d 6f 64 28 7a 46 69  ode && chmod(zFi
10630 6c 65 2c 20 6d 6f 64 65 20 26 20 30 37 37 37 29  le, mode & 0777)
10640 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10650 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
10660 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
10670 6e 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n 2;.      sqlit
10680 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
10690 70 43 74 78 2c 20 6e 57 72 69 74 65 29 3b 0a 20  pCtx, nWrite);. 
106a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
106b0 6d 74 69 6d 65 3e 3d 30 20 29 7b 0a 23 69 66 20  mtime>=0 ){.#if 
106c0 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
106d0 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 73 20 2a      /* Windows *
106e0 2f 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20 6c  /.    FILETIME l
106f0 61 73 74 41 63 63 65 73 73 3b 0a 20 20 20 20 46  astAccess;.    F
10700 49 4c 45 54 49 4d 45 20 6c 61 73 74 57 72 69 74  ILETIME lastWrit
10710 65 3b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d  e;.    SYSTEMTIM
10720 45 20 63 75 72 72 65 6e 74 54 69 6d 65 3b 0a 20  E currentTime;. 
10730 20 20 20 4c 4f 4e 47 4c 4f 4e 47 20 69 6e 74 65     LONGLONG inte
10740 72 76 61 6c 73 3b 0a 20 20 20 20 48 41 4e 44 4c  rvals;.    HANDL
10750 45 20 68 46 69 6c 65 3b 0a 20 20 20 20 4c 50 57  E hFile;.    LPW
10760 53 54 52 20 7a 55 6e 69 63 6f 64 65 4e 61 6d 65  STR zUnicodeName
10770 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 4c 50 57  ;.    extern LPW
10780 53 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  STR sqlite3_win3
10790 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64  2_utf8_to_unicod
107a0 65 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  e(const char*);.
107b0 0a 20 20 20 20 47 65 74 53 79 73 74 65 6d 54 69  .    GetSystemTi
107c0 6d 65 28 26 63 75 72 72 65 6e 74 54 69 6d 65 29  me(&currentTime)
107d0 3b 0a 20 20 20 20 53 79 73 74 65 6d 54 69 6d 65  ;.    SystemTime
107e0 54 6f 46 69 6c 65 54 69 6d 65 28 26 63 75 72 72  ToFileTime(&curr
107f0 65 6e 74 54 69 6d 65 2c 20 26 6c 61 73 74 41 63  entTime, &lastAc
10800 63 65 73 73 29 3b 0a 20 20 20 20 69 6e 74 65 72  cess);.    inter
10810 76 61 6c 73 20 3d 20 49 6e 74 33 32 78 33 32 54  vals = Int32x32T
10820 6f 36 34 28 6d 74 69 6d 65 2c 20 31 30 30 30 30  o64(mtime, 10000
10830 30 30 30 29 20 2b 20 31 31 36 34 34 34 37 33 36  000) + 116444736
10840 30 30 30 30 30 30 30 30 30 3b 0a 20 20 20 20 6c  000000000;.    l
10850 61 73 74 57 72 69 74 65 2e 64 77 4c 6f 77 44 61  astWrite.dwLowDa
10860 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
10870 69 6e 74 65 72 76 61 6c 73 3b 0a 20 20 20 20 6c  intervals;.    l
10880 61 73 74 57 72 69 74 65 2e 64 77 48 69 67 68 44  astWrite.dwHighD
10890 61 74 65 54 69 6d 65 20 3d 20 69 6e 74 65 72 76  ateTime = interv
108a0 61 6c 73 20 3e 3e 20 33 32 3b 0a 20 20 20 20 7a  als >> 32;.    z
108b0 55 6e 69 63 6f 64 65 4e 61 6d 65 20 3d 20 73 71  UnicodeName = sq
108c0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
108d0 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69 6c  _to_unicode(zFil
108e0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 6e 69  e);.    if( zUni
108f0 63 6f 64 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  codeName==0 ){. 
10900 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
10910 20 20 20 7d 0a 20 20 20 20 68 46 69 6c 65 20 3d     }.    hFile =
10920 20 43 72 65 61 74 65 46 69 6c 65 57 28 0a 20 20   CreateFileW(.  
10930 20 20 20 20 7a 55 6e 69 63 6f 64 65 4e 61 6d 65      zUnicodeName
10940 2c 20 46 49 4c 45 5f 57 52 49 54 45 5f 41 54 54  , FILE_WRITE_ATT
10950 52 49 42 55 54 45 53 2c 20 30 2c 20 4e 55 4c 4c  RIBUTES, 0, NULL
10960 2c 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c  , OPEN_EXISTING,
10970 0a 20 20 20 20 20 20 46 49 4c 45 5f 46 4c 41 47  .      FILE_FLAG
10980 5f 42 41 43 4b 55 50 5f 53 45 4d 41 4e 54 49 43  _BACKUP_SEMANTIC
10990 53 2c 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20  S, NULL.    );. 
109a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
109b0 7a 55 6e 69 63 6f 64 65 4e 61 6d 65 29 3b 0a 20  zUnicodeName);. 
109c0 20 20 20 69 66 28 20 68 46 69 6c 65 21 3d 49 4e     if( hFile!=IN
109d0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
109e0 55 45 20 29 7b 0a 20 20 20 20 20 20 42 4f 4f 4c  UE ){.      BOOL
109f0 20 62 52 65 73 75 6c 74 20 3d 20 53 65 74 46 69   bResult = SetFi
10a00 6c 65 54 69 6d 65 28 68 46 69 6c 65 2c 20 4e 55  leTime(hFile, NU
10a10 4c 4c 2c 20 26 6c 61 73 74 41 63 63 65 73 73 2c  LL, &lastAccess,
10a20 20 26 6c 61 73 74 57 72 69 74 65 29 3b 0a 20 20   &lastWrite);.  
10a30 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
10a40 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  hFile);.      re
10a50 74 75 72 6e 20 21 62 52 65 73 75 6c 74 3b 0a 20  turn !bResult;. 
10a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10a70 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
10a80 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 41 54  #elif defined(AT
10a90 5f 46 44 43 57 44 29 20 26 26 20 30 20 2f 2a 20  _FDCWD) && 0 /* 
10aa0 75 74 69 6d 65 6e 73 61 74 28 29 20 69 73 20 6e  utimensat() is n
10ab0 6f 74 20 75 6e 69 76 65 72 73 61 6c 6c 79 20 61  ot universally a
10ac0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 20 20  vailable */.    
10ad0 2f 2a 20 52 65 63 65 6e 74 20 75 6e 69 78 20 2a  /* Recent unix *
10ae0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 74 69 6d  /.    struct tim
10af0 65 73 70 65 63 20 74 69 6d 65 73 5b 32 5d 3b 0a  espec times[2];.
10b00 20 20 20 20 74 69 6d 65 73 5b 30 5d 2e 74 76 5f      times[0].tv_
10b10 6e 73 65 63 20 3d 20 74 69 6d 65 73 5b 31 5d 2e  nsec = times[1].
10b20 74 76 5f 6e 73 65 63 20 3d 20 30 3b 0a 20 20 20  tv_nsec = 0;.   
10b30 20 74 69 6d 65 73 5b 30 5d 2e 74 76 5f 73 65 63   times[0].tv_sec
10b40 20 3d 20 74 69 6d 65 28 30 29 3b 0a 20 20 20 20   = time(0);.    
10b50 74 69 6d 65 73 5b 31 5d 2e 74 76 5f 73 65 63 20  times[1].tv_sec 
10b60 3d 20 6d 74 69 6d 65 3b 0a 20 20 20 20 69 66 28  = mtime;.    if(
10b70 20 75 74 69 6d 65 6e 73 61 74 28 41 54 5f 46 44   utimensat(AT_FD
10b80 43 57 44 2c 20 7a 46 69 6c 65 2c 20 74 69 6d 65  CWD, zFile, time
10b90 73 2c 20 41 54 5f 53 59 4d 4c 49 4e 4b 5f 4e 4f  s, AT_SYMLINK_NO
10ba0 46 4f 4c 4c 4f 57 29 20 29 7b 0a 20 20 20 20 20  FOLLOW) ){.     
10bb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
10bc0 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 4c 65  .#else.    /* Le
10bd0 67 61 63 79 20 75 6e 69 78 20 2a 2f 0a 20 20 20  gacy unix */.   
10be0 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
10bf0 74 69 6d 65 73 5b 32 5d 3b 0a 20 20 20 20 74 69  times[2];.    ti
10c00 6d 65 73 5b 30 5d 2e 74 76 5f 75 73 65 63 20 3d  mes[0].tv_usec =
10c10 20 74 69 6d 65 73 5b 31 5d 2e 74 76 5f 75 73 65   times[1].tv_use
10c20 63 20 3d 20 30 3b 0a 20 20 20 20 74 69 6d 65 73  c = 0;.    times
10c30 5b 30 5d 2e 74 76 5f 73 65 63 20 3d 20 74 69 6d  [0].tv_sec = tim
10c40 65 28 30 29 3b 0a 20 20 20 20 74 69 6d 65 73 5b  e(0);.    times[
10c50 31 5d 2e 74 76 5f 73 65 63 20 3d 20 6d 74 69 6d  1].tv_sec = mtim
10c60 65 3b 0a 20 20 20 20 69 66 28 20 75 74 69 6d 65  e;.    if( utime
10c70 73 28 7a 46 69 6c 65 2c 20 74 69 6d 65 73 29 20  s(zFile, times) 
10c80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10c90 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
10ca0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
10cb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
10cc0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
10cd0 22 77 72 69 74 65 66 69 6c 65 28 57 2c 58 5b 2c  "writefile(W,X[,
10ce0 59 5b 2c 5a 5d 5d 5d 29 22 20 53 51 4c 20 66 75  Y[,Z]]])" SQL fu
10cf0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 20 52 65 66  nction.  .** Ref
10d00 65 72 20 74 6f 20 68 65 61 64 65 72 20 63 6f 6d  er to header com
10d10 6d 65 6e 74 73 20 61 74 20 74 68 65 20 74 6f 70  ments at the top
10d20 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f   of this file fo
10d30 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74  r details..*/.st
10d40 61 74 69 63 20 76 6f 69 64 20 77 72 69 74 65 66  atic void writef
10d50 69 6c 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ileFunc(.  sqlit
10d60 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
10d70 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
10d80 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
10d90 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
10da0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  st char *zFile;.
10db0 20 20 6d 6f 64 65 5f 74 20 6d 6f 64 65 20 3d 20    mode_t mode = 
10dc0 30 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  0;.  int res;.  
10dd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 74  sqlite3_int64 mt
10de0 69 6d 65 20 3d 20 2d 31 3b 0a 0a 20 20 69 66 28  ime = -1;..  if(
10df0 20 61 72 67 63 3c 32 20 7c 7c 20 61 72 67 63 3e   argc<2 || argc>
10e00 34 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  4 ){.    sqlite3
10e10 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
10e20 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
10e30 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
10e40 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
10e50 6e 63 74 69 6f 6e 20 77 72 69 74 65 66 69 6c 65  nction writefile
10e60 28 29 22 2c 20 2d 31 0a 20 20 20 20 29 3b 0a 20  ()", -1.    );. 
10e70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
10e80 20 20 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74    zFile = (const
10e90 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
10ea0 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
10eb0 5d 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d  ]);.  if( zFile=
10ec0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
10ed0 66 28 20 61 72 67 63 3e 3d 33 20 29 7b 0a 20 20  f( argc>=3 ){.  
10ee0 20 20 6d 6f 64 65 20 3d 20 28 6d 6f 64 65 5f 74    mode = (mode_t
10ef0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  )sqlite3_value_i
10f00 6e 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 7d  nt(argv[2]);.  }
10f10 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29  .  if( argc==4 )
10f20 7b 0a 20 20 20 20 6d 74 69 6d 65 20 3d 20 73 71  {.    mtime = sq
10f30 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
10f40 34 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 7d 0a  4(argv[3]);.  }.
10f50 0a 20 20 72 65 73 20 3d 20 77 72 69 74 65 46 69  .  res = writeFi
10f60 6c 65 28 63 6f 6e 74 65 78 74 2c 20 7a 46 69 6c  le(context, zFil
10f70 65 2c 20 61 72 67 76 5b 31 5d 2c 20 6d 6f 64 65  e, argv[1], mode
10f80 2c 20 6d 74 69 6d 65 29 3b 0a 20 20 69 66 28 20  , mtime);.  if( 
10f90 72 65 73 3d 3d 31 20 26 26 20 65 72 72 6e 6f 3d  res==1 && errno=
10fa0 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 69  =ENOENT ){.    i
10fb0 66 28 20 6d 61 6b 65 44 69 72 65 63 74 6f 72 79  f( makeDirectory
10fc0 28 7a 46 69 6c 65 2c 20 6d 6f 64 65 29 3d 3d 53  (zFile, mode)==S
10fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10fe0 20 20 72 65 73 20 3d 20 77 72 69 74 65 46 69 6c    res = writeFil
10ff0 65 28 63 6f 6e 74 65 78 74 2c 20 7a 46 69 6c 65  e(context, zFile
11000 2c 20 61 72 67 76 5b 31 5d 2c 20 6d 6f 64 65 2c  , argv[1], mode,
11010 20 6d 74 69 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   mtime);.    }. 
11020 20 7d 0a 0a 20 20 69 66 28 20 61 72 67 63 3e 32   }..  if( argc>2
11030 20 26 26 20 72 65 73 21 3d 30 20 29 7b 0a 20 20   && res!=0 ){.  
11040 20 20 69 66 28 20 53 5f 49 53 4c 4e 4b 28 6d 6f    if( S_ISLNK(mo
11050 64 65 29 20 29 7b 0a 20 20 20 20 20 20 63 74 78  de) ){.      ctx
11060 45 72 72 6f 72 4d 73 67 28 63 6f 6e 74 65 78 74  ErrorMsg(context
11070 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 63 72 65  , "failed to cre
11080 61 74 65 20 73 79 6d 6c 69 6e 6b 3a 20 25 73 22  ate symlink: %s"
11090 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 65  , zFile);.    }e
110a0 6c 73 65 20 69 66 28 20 53 5f 49 53 44 49 52 28  lse if( S_ISDIR(
110b0 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 63  mode) ){.      c
110c0 74 78 45 72 72 6f 72 4d 73 67 28 63 6f 6e 74 65  txErrorMsg(conte
110d0 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 63  xt, "failed to c
110e0 72 65 61 74 65 20 64 69 72 65 63 74 6f 72 79 3a  reate directory:
110f0 20 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20   %s", zFile);.  
11100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
11110 74 78 45 72 72 6f 72 4d 73 67 28 63 6f 6e 74 65  txErrorMsg(conte
11120 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 77  xt, "failed to w
11130 72 69 74 65 20 66 69 6c 65 3a 20 25 73 22 2c 20  rite file: %s", 
11140 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zFile);.    }.  
11150 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  }.}../*.** SQL f
11160 75 6e 63 74 69 6f 6e 3a 20 20 20 6c 73 6d 6f 64  unction:   lsmod
11170 65 28 4d 4f 44 45 29 0a 2a 2a 0a 2a 2a 20 47 69  e(MODE).**.** Gi
11180 76 65 6e 20 61 20 6e 75 6d 62 65 72 69 63 20 73  ven a numberic s
11190 74 5f 6d 6f 64 65 20 66 72 6f 6d 20 73 74 61 74  t_mode from stat
111a0 28 29 2c 20 63 6f 6e 76 65 72 74 20 69 74 20 69  (), convert it i
111b0 6e 74 6f 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nto a human-read
111c0 61 62 6c 65 0a 2a 2a 20 74 65 78 74 20 73 74 72  able.** text str
111d0 69 6e 67 20 69 6e 20 74 68 65 20 73 74 79 6c 65  ing in the style
111e0 20 6f 66 20 22 6c 73 20 2d 6c 22 2e 0a 2a 2f 0a   of "ls -l"..*/.
111f0 73 74 61 74 69 63 20 76 6f 69 64 20 6c 73 4d 6f  static void lsMo
11200 64 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  deFunc(.  sqlite
11210 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
11220 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
11230 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
11240 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
11250 69 3b 0a 20 20 69 6e 74 20 69 4d 6f 64 65 20 3d  i;.  int iMode =
11260 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
11270 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63  nt(argv[0]);.  c
11280 68 61 72 20 7a 5b 31 36 5d 3b 0a 20 20 28 76 6f  har z[16];.  (vo
11290 69 64 29 61 72 67 63 3b 0a 20 20 69 66 28 20 53  id)argc;.  if( S
112a0 5f 49 53 4c 4e 4b 28 69 4d 6f 64 65 29 20 29 7b  _ISLNK(iMode) ){
112b0 0a 20 20 20 20 7a 5b 30 5d 20 3d 20 27 6c 27 3b  .    z[0] = 'l';
112c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53 5f 49  .  }else if( S_I
112d0 53 52 45 47 28 69 4d 6f 64 65 29 20 29 7b 0a 20  SREG(iMode) ){. 
112e0 20 20 20 7a 5b 30 5d 20 3d 20 27 2d 27 3b 0a 20     z[0] = '-';. 
112f0 20 7d 65 6c 73 65 20 69 66 28 20 53 5f 49 53 44   }else if( S_ISD
11300 49 52 28 69 4d 6f 64 65 29 20 29 7b 0a 20 20 20  IR(iMode) ){.   
11310 20 7a 5b 30 5d 20 3d 20 27 64 27 3b 0a 20 20 7d   z[0] = 'd';.  }
11320 65 6c 73 65 7b 0a 20 20 20 20 7a 5b 30 5d 20 3d  else{.    z[0] =
11330 20 27 3f 27 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   '?';.  }.  for(
11340 69 3d 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a  i=0; i<3; i++){.
11350 20 20 20 20 69 6e 74 20 6d 20 3d 20 28 69 4d 6f      int m = (iMo
11360 64 65 20 3e 3e 20 28 28 32 2d 69 29 2a 33 29 29  de >> ((2-i)*3))
11370 3b 0a 20 20 20 20 63 68 61 72 20 2a 61 20 3d 20  ;.    char *a = 
11380 26 7a 5b 31 20 2b 20 69 2a 33 5d 3b 0a 20 20 20  &z[1 + i*3];.   
11390 20 61 5b 30 5d 20 3d 20 28 6d 20 26 20 30 78 34   a[0] = (m & 0x4
113a0 29 20 3f 20 27 72 27 20 3a 20 27 2d 27 3b 0a 20  ) ? 'r' : '-';. 
113b0 20 20 20 61 5b 31 5d 20 3d 20 28 6d 20 26 20 30     a[1] = (m & 0
113c0 78 32 29 20 3f 20 27 77 27 20 3a 20 27 2d 27 3b  x2) ? 'w' : '-';
113d0 0a 20 20 20 20 61 5b 32 5d 20 3d 20 28 6d 20 26  .    a[2] = (m &
113e0 20 30 78 31 29 20 3f 20 27 78 27 20 3a 20 27 2d   0x1) ? 'x' : '-
113f0 27 3b 0a 20 20 7d 0a 20 20 7a 5b 31 30 5d 20 3d  ';.  }.  z[10] =
11400 20 27 5c 30 27 3b 0a 20 20 73 71 6c 69 74 65 33   '\0';.  sqlite3
11410 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
11420 74 65 78 74 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  text, z, -1, SQL
11430 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
11440 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11450 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11460 42 4c 45 0a 0a 2f 2a 20 0a 2a 2a 20 43 75 72 73  BLE../* .** Curs
11470 6f 72 20 74 79 70 65 20 66 6f 72 20 72 65 63 75  or type for recu
11480 72 73 69 76 65 6c 79 20 69 74 65 72 61 74 69 6e  rsively iteratin
11490 67 20 74 68 72 6f 75 67 68 20 61 20 64 69 72 65  g through a dire
114a0 63 74 6f 72 79 20 73 74 72 75 63 74 75 72 65 2e  ctory structure.
114b0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
114c0 63 74 20 66 73 64 69 72 5f 63 75 72 73 6f 72 20  ct fsdir_cursor 
114d0 66 73 64 69 72 5f 63 75 72 73 6f 72 3b 0a 74 79  fsdir_cursor;.ty
114e0 70 65 64 65 66 20 73 74 72 75 63 74 20 46 73 64  pedef struct Fsd
114f0 69 72 4c 65 76 65 6c 20 46 73 64 69 72 4c 65 76  irLevel FsdirLev
11500 65 6c 3b 0a 0a 73 74 72 75 63 74 20 46 73 64 69  el;..struct Fsdi
11510 72 4c 65 76 65 6c 20 7b 0a 20 20 44 49 52 20 2a  rLevel {.  DIR *
11520 70 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20  pDir;           
11530 20 20 20 20 20 20 2f 2a 20 46 72 6f 6d 20 6f 70        /* From op
11540 65 6e 64 69 72 28 29 20 2a 2f 0a 20 20 63 68 61  endir() */.  cha
11550 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20  r *zDir;        
11560 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11570 6f 66 20 64 69 72 65 63 74 6f 72 79 20 28 6e 75  of directory (nu
11580 6c 2d 74 65 72 6d 69 6e 61 74 65 64 29 20 2a 2f  l-terminated) */
11590 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 66 73 64 69  .};..struct fsdi
115a0 72 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  r_cursor {.  sql
115b0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
115c0 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20   base;  /* Base 
115d0 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
115e0 66 69 72 73 74 20 2a 2f 0a 0a 20 20 69 6e 74 20  first */..  int 
115f0 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nLvl;           
11600 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11610 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
11620 4c 76 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Lvl[] array */. 
11630 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
11640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11650 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
11660 65 6e 74 72 79 20 2a 2f 0a 20 20 46 73 64 69 72  entry */.  Fsdir
11670 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b 20 20 20 20  Level *aLvl;    
11680 20 20 20 20 20 20 2f 2a 20 48 69 65 72 61 72 63        /* Hierarc
11690 68 79 20 6f 66 20 64 69 72 65 63 74 6f 72 69 65  hy of directorie
116a0 73 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65  s being traverse
116b0 64 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68  d */..  const ch
116c0 61 72 20 2a 7a 42 61 73 65 3b 0a 20 20 69 6e 74  ar *zBase;.  int
116d0 20 6e 42 61 73 65 3b 0a 0a 20 20 73 74 72 75 63   nBase;..  struc
116e0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
116f0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
11700 20 6c 73 74 61 74 28 29 20 72 65 73 75 6c 74 73   lstat() results
11710 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
11720 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
11730 20 2f 2a 20 50 61 74 68 20 74 6f 20 63 75 72 72   /* Path to curr
11740 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  ent entry */.  s
11750 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
11760 77 69 64 3b 20 20 20 20 20 20 2f 2a 20 43 75 72  wid;      /* Cur
11770 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 7d 3b  rent rowid */.};
11780 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
11790 20 66 73 64 69 72 5f 74 61 62 20 66 73 64 69 72   fsdir_tab fsdir
117a0 5f 74 61 62 3b 0a 73 74 72 75 63 74 20 66 73 64  _tab;.struct fsd
117b0 69 72 5f 74 61 62 20 7b 0a 20 20 73 71 6c 69 74  ir_tab {.  sqlit
117c0 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20  e3_vtab base;   
117d0 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c        /* Base cl
117e0 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69  ass - must be fi
117f0 72 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  rst */.};../*.**
11800 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
11810 20 66 73 64 69 72 20 76 69 72 74 75 61 6c 20 74   fsdir virtual t
11820 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
11830 73 74 61 74 69 63 20 69 6e 74 20 66 73 64 69 72  static int fsdir
11840 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74  Connect(.  sqlit
11850 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
11860 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
11870 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  , const char *co
11880 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  nst*argv,.  sqli
11890 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
118a0 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
118b0 72 0a 29 7b 0a 20 20 66 73 64 69 72 5f 74 61 62  r.){.  fsdir_tab
118c0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e   *pNew = 0;.  in
118d0 74 20 72 63 3b 0a 20 20 28 76 6f 69 64 29 70 41  t rc;.  (void)pA
118e0 75 78 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 63  ux;.  (void)argc
118f0 3b 0a 20 20 28 76 6f 69 64 29 61 72 67 76 3b 0a  ;.  (void)argv;.
11900 20 20 28 76 6f 69 64 29 70 7a 45 72 72 3b 0a 20    (void)pzErr;. 
11910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
11920 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 22  clare_vtab(db, "
11930 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 22 20  CREATE TABLE x" 
11940 46 53 44 49 52 5f 53 43 48 45 4d 41 29 3b 0a 20  FSDIR_SCHEMA);. 
11950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11960 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  OK ){.    pNew =
11970 20 28 66 73 64 69 72 5f 74 61 62 2a 29 73 71 6c   (fsdir_tab*)sql
11980 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
11990 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
119a0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
119b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
119c0 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  MEM;.    memset(
119d0 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
119e0 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 2a  *pNew));.  }.  *
119f0 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVtab = (sqlite
11a00 33 5f 76 74 61 62 2a 29 70 4e 65 77 3b 0a 20 20  3_vtab*)pNew;.  
11a10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11a20 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20  .** This method 
11a30 69 73 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  is the destructo
11a40 72 20 66 6f 72 20 66 73 64 69 72 20 76 74 61 62  r for fsdir vtab
11a50 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
11a60 74 69 63 20 69 6e 74 20 66 73 64 69 72 44 69 73  tic int fsdirDis
11a70 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
11a80 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
11a90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
11aa0 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
11ab0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11ac0 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f  * Constructor fo
11ad0 72 20 61 20 6e 65 77 20 66 73 64 69 72 5f 63 75  r a new fsdir_cu
11ae0 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  rsor object..*/.
11af0 73 74 61 74 69 63 20 69 6e 74 20 66 73 64 69 72  static int fsdir
11b00 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
11b10 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  b *p, sqlite3_vt
11b20 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75  ab_cursor **ppCu
11b30 72 73 6f 72 29 7b 0a 20 20 66 73 64 69 72 5f 63  rsor){.  fsdir_c
11b40 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 28  ursor *pCur;.  (
11b50 76 6f 69 64 29 70 3b 0a 20 20 70 43 75 72 20 3d  void)p;.  pCur =
11b60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
11b70 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29   sizeof(*pCur) )
11b80 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20  ;.  if( pCur==0 
11b90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11ba0 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
11bb0 70 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCur, 0, sizeof(
11bc0 2a 70 43 75 72 29 29 3b 0a 20 20 70 43 75 72 2d  *pCur));.  pCur-
11bd0 3e 69 4c 76 6c 20 3d 20 2d 31 3b 0a 20 20 2a 70  >iLvl = -1;.  *p
11be0 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d  pCursor = &pCur-
11bf0 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
11c00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11c10 0a 2a 2a 20 52 65 73 65 74 20 61 20 63 75 72 73  .** Reset a curs
11c20 6f 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  or back to the s
11c30 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 77  tate it was in w
11c40 68 65 6e 20 66 69 72 73 74 20 72 65 74 75 72 6e  hen first return
11c50 65 64 0a 2a 2a 20 62 79 20 66 73 64 69 72 4f 70  ed.** by fsdirOp
11c60 65 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  en()..*/.static 
11c70 76 6f 69 64 20 66 73 64 69 72 52 65 73 65 74 43  void fsdirResetC
11c80 75 72 73 6f 72 28 66 73 64 69 72 5f 63 75 72 73  ursor(fsdir_curs
11c90 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
11ca0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
11cb0 3c 3d 70 43 75 72 2d 3e 69 4c 76 6c 3b 20 69 2b  <=pCur->iLvl; i+
11cc0 2b 29 7b 0a 20 20 20 20 46 73 64 69 72 4c 65 76  +){.    FsdirLev
11cd0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 43 75 72  el *pLvl = &pCur
11ce0 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 69  ->aLvl[i];.    i
11cf0 66 28 20 70 4c 76 6c 2d 3e 70 44 69 72 20 29 20  f( pLvl->pDir ) 
11d00 63 6c 6f 73 65 64 69 72 28 70 4c 76 6c 2d 3e 70  closedir(pLvl->p
11d10 44 69 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Dir);.    sqlite
11d20 33 5f 66 72 65 65 28 70 4c 76 6c 2d 3e 7a 44 69  3_free(pLvl->zDi
11d30 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
11d40 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a 50 61  3_free(pCur->zPa
11d50 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  th);.  sqlite3_f
11d60 72 65 65 28 70 43 75 72 2d 3e 61 4c 76 6c 29 3b  ree(pCur->aLvl);
11d70 0a 20 20 70 43 75 72 2d 3e 61 4c 76 6c 20 3d 20  .  pCur->aLvl = 
11d80 30 3b 0a 20 20 70 43 75 72 2d 3e 7a 50 61 74 68  0;.  pCur->zPath
11d90 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 7a 42   = 0;.  pCur->zB
11da0 61 73 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ase = 0;.  pCur-
11db0 3e 6e 42 61 73 65 20 3d 20 30 3b 0a 20 20 70 43  >nBase = 0;.  pC
11dc0 75 72 2d 3e 6e 4c 76 6c 20 3d 20 30 3b 0a 20 20  ur->nLvl = 0;.  
11dd0 70 43 75 72 2d 3e 69 4c 76 6c 20 3d 20 2d 31 3b  pCur->iLvl = -1;
11de0 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 20  .  pCur->iRowid 
11df0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  = 1;.}../*.** De
11e00 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 6e 20  structor for an 
11e10 66 73 64 69 72 5f 63 75 72 73 6f 72 2e 0a 2a 2f  fsdir_cursor..*/
11e20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73 64 69  .static int fsdi
11e30 72 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  rClose(sqlite3_v
11e40 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
11e50 7b 0a 20 20 66 73 64 69 72 5f 63 75 72 73 6f 72  {.  fsdir_cursor
11e60 20 2a 70 43 75 72 20 3d 20 28 66 73 64 69 72 5f   *pCur = (fsdir_
11e70 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 0a 20 20  cursor*)cur;..  
11e80 66 73 64 69 72 52 65 73 65 74 43 75 72 73 6f 72  fsdirResetCursor
11e90 28 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65  (pCur);.  sqlite
11ea0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20  3_free(pCur);.  
11eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11ed0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
11ee0 20 66 6f 72 20 74 68 65 20 76 69 72 74 75 61 6c   for the virtual
11ef0 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
11f00 64 20 77 69 74 68 20 63 75 72 73 6f 72 0a 2a 2a  d with cursor.**
11f10 20 70 43 75 72 20 74 6f 20 74 68 65 20 72 65 73   pCur to the res
11f20 75 6c 74 73 20 6f 66 20 76 70 72 69 6e 74 66 28  ults of vprintf(
11f30 7a 46 6d 74 2c 20 2e 2e 2e 29 2e 0a 2a 2f 0a 73  zFmt, ...)..*/.s
11f40 74 61 74 69 63 20 76 6f 69 64 20 66 73 64 69 72  tatic void fsdir
11f50 53 65 74 45 72 72 6d 73 67 28 66 73 64 69 72 5f  SetErrmsg(fsdir_
11f60 63 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 63 6f  cursor *pCur, co
11f70 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
11f80 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
11f90 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
11fa0 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 70 43 75 72  p, zFmt);.  pCur
11fb0 2d 3e 62 61 73 65 2e 70 56 74 61 62 2d 3e 7a 45  ->base.pVtab->zE
11fc0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
11fd0 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61  vmprintf(zFmt, a
11fe0 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
11ff0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  ;.}.../*.** Adva
12000 6e 63 65 20 61 6e 20 66 73 64 69 72 5f 63 75 72  nce an fsdir_cur
12010 73 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20  sor to its next 
12020 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 0a 2a  row of output..*
12030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73 64  /.static int fsd
12040 69 72 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76  irNext(sqlite3_v
12050 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
12060 7b 0a 20 20 66 73 64 69 72 5f 63 75 72 73 6f 72  {.  fsdir_cursor
12070 20 2a 70 43 75 72 20 3d 20 28 66 73 64 69 72 5f   *pCur = (fsdir_
12080 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 6d  cursor*)cur;.  m
12090 6f 64 65 5f 74 20 6d 20 3d 20 70 43 75 72 2d 3e  ode_t m = pCur->
120a0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 3b 0a 0a  sStat.st_mode;..
120b0 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 2b 2b    pCur->iRowid++
120c0 3b 0a 20 20 69 66 28 20 53 5f 49 53 44 49 52 28  ;.  if( S_ISDIR(
120d0 6d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 73  m) ){.    /* Des
120e0 63 65 6e 64 20 69 6e 74 6f 20 74 68 69 73 20 64  cend into this d
120f0 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
12100 69 6e 74 20 69 4e 65 77 20 3d 20 70 43 75 72 2d  int iNew = pCur-
12110 3e 69 4c 76 6c 20 2b 20 31 3b 0a 20 20 20 20 46  >iLvl + 1;.    F
12120 73 64 69 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b  sdirLevel *pLvl;
12130 0a 20 20 20 20 69 66 28 20 69 4e 65 77 3e 3d 70  .    if( iNew>=p
12140 43 75 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20  Cur->nLvl ){.   
12150 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 69 4e     int nNew = iN
12160 65 77 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  ew+1;.      sqli
12170 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
12180 3d 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 46 73  = nNew*sizeof(Fs
12190 64 69 72 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  dirLevel);.     
121a0 20 46 73 64 69 72 4c 65 76 65 6c 20 2a 61 4e 65   FsdirLevel *aNe
121b0 77 20 3d 20 28 46 73 64 69 72 4c 65 76 65 6c 2a  w = (FsdirLevel*
121c0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
121d0 36 34 28 70 43 75 72 2d 3e 61 4c 76 6c 2c 20 6e  64(pCur->aLvl, n
121e0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
121f0 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
12200 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12210 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
12220 65 77 5b 70 43 75 72 2d 3e 6e 4c 76 6c 5d 2c 20  ew[pCur->nLvl], 
12230 30 2c 20 73 69 7a 65 6f 66 28 46 73 64 69 72 4c  0, sizeof(FsdirL
12240 65 76 65 6c 29 2a 28 6e 4e 65 77 2d 70 43 75 72  evel)*(nNew-pCur
12250 2d 3e 6e 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  ->nLvl));.      
12260 70 43 75 72 2d 3e 61 4c 76 6c 20 3d 20 61 4e 65  pCur->aLvl = aNe
12270 77 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 6e  w;.      pCur->n
12280 4c 76 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  Lvl = nNew;.    
12290 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 4c 76 6c  }.    pCur->iLvl
122a0 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 70 4c 76   = iNew;.    pLv
122b0 6c 20 3d 20 26 70 43 75 72 2d 3e 61 4c 76 6c 5b  l = &pCur->aLvl[
122c0 69 4e 65 77 5d 3b 0a 20 20 20 20 0a 20 20 20 20  iNew];.    .    
122d0 70 4c 76 6c 2d 3e 7a 44 69 72 20 3d 20 70 43 75  pLvl->zDir = pCu
122e0 72 2d 3e 7a 50 61 74 68 3b 0a 20 20 20 20 70 43  r->zPath;.    pC
122f0 75 72 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20  ur->zPath = 0;. 
12300 20 20 20 70 4c 76 6c 2d 3e 70 44 69 72 20 3d 20     pLvl->pDir = 
12310 6f 70 65 6e 64 69 72 28 70 4c 76 6c 2d 3e 7a 44  opendir(pLvl->zD
12320 69 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  ir);.    if( pLv
12330 6c 2d 3e 70 44 69 72 3d 3d 30 20 29 7b 0a 20 20  l->pDir==0 ){.  
12340 20 20 20 20 66 73 64 69 72 53 65 74 45 72 72 6d      fsdirSetErrm
12350 73 67 28 70 43 75 72 2c 20 22 63 61 6e 6e 6f 74  sg(pCur, "cannot
12360 20 72 65 61 64 20 64 69 72 65 63 74 6f 72 79 3a   read directory:
12370 20 25 73 22 2c 20 70 43 75 72 2d 3e 7a 50 61 74   %s", pCur->zPat
12380 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  h);.      return
12390 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
123a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c     }.  }..  whil
123b0 65 28 20 70 43 75 72 2d 3e 69 4c 76 6c 3e 3d 30  e( pCur->iLvl>=0
123c0 20 29 7b 0a 20 20 20 20 46 73 64 69 72 4c 65 76   ){.    FsdirLev
123d0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 43 75 72  el *pLvl = &pCur
123e0 2d 3e 61 4c 76 6c 5b 70 43 75 72 2d 3e 69 4c 76  ->aLvl[pCur->iLv
123f0 6c 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 64  l];.    struct d
12400 69 72 65 6e 74 20 2a 70 45 6e 74 72 79 20 3d 20  irent *pEntry = 
12410 72 65 61 64 64 69 72 28 70 4c 76 6c 2d 3e 70 44  readdir(pLvl->pD
12420 69 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 6e  ir);.    if( pEn
12430 74 72 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  try ){.      if(
12440 20 70 45 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 5b   pEntry->d_name[
12450 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
12460 20 20 69 66 28 20 70 45 6e 74 72 79 2d 3e 64 5f    if( pEntry->d_
12470 6e 61 6d 65 5b 31 5d 3d 3d 27 2e 27 20 26 26 20  name[1]=='.' && 
12480 70 45 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 5b 32  pEntry->d_name[2
12490 5d 3d 3d 27 5c 30 27 20 29 20 63 6f 6e 74 69 6e  ]=='\0' ) contin
124a0 75 65 3b 0a 20 20 20 20 20 20 20 69 66 28 20 70  ue;.       if( p
124b0 45 6e 74 72 79 2d 3e 64 5f 6e 61 6d 65 5b 31 5d  Entry->d_name[1]
124c0 3d 3d 27 5c 30 27 20 29 20 63 6f 6e 74 69 6e 75  =='\0' ) continu
124d0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
124e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
124f0 75 72 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  ur->zPath);.    
12500 20 20 70 43 75 72 2d 3e 7a 50 61 74 68 20 3d 20    pCur->zPath = 
12510 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12520 22 25 73 2f 25 73 22 2c 20 70 4c 76 6c 2d 3e 7a  "%s/%s", pLvl->z
12530 44 69 72 2c 20 70 45 6e 74 72 79 2d 3e 64 5f 6e  Dir, pEntry->d_n
12540 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
12550 70 43 75 72 2d 3e 7a 50 61 74 68 3d 3d 30 20 29  pCur->zPath==0 )
12560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12570 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 69 66 28 20  OMEM;.      if( 
12580 66 69 6c 65 4c 69 6e 6b 53 74 61 74 28 70 43 75  fileLinkStat(pCu
12590 72 2d 3e 7a 50 61 74 68 2c 20 26 70 43 75 72 2d  r->zPath, &pCur-
125a0 3e 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  >sStat) ){.     
125b0 20 20 20 66 73 64 69 72 53 65 74 45 72 72 6d 73     fsdirSetErrms
125c0 67 28 70 43 75 72 2c 20 22 63 61 6e 6e 6f 74 20  g(pCur, "cannot 
125d0 73 74 61 74 20 66 69 6c 65 3a 20 25 73 22 2c 20  stat file: %s", 
125e0 70 43 75 72 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  pCur->zPath);.  
125f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12600 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
12610 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
12620 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12630 0a 20 20 20 20 63 6c 6f 73 65 64 69 72 28 70 4c  .    closedir(pL
12640 76 6c 2d 3e 70 44 69 72 29 3b 0a 20 20 20 20 73  vl->pDir);.    s
12650 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 76 6c  qlite3_free(pLvl
12660 2d 3e 7a 44 69 72 29 3b 0a 20 20 20 20 70 4c 76  ->zDir);.    pLv
12670 6c 2d 3e 70 44 69 72 20 3d 20 30 3b 0a 20 20 20  l->pDir = 0;.   
12680 20 70 4c 76 6c 2d 3e 7a 44 69 72 20 3d 20 30 3b   pLvl->zDir = 0;
12690 0a 20 20 20 20 70 43 75 72 2d 3e 69 4c 76 6c 2d  .    pCur->iLvl-
126a0 2d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 4f 46  -;.  }..  /* EOF
126b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
126c0 65 65 28 70 43 75 72 2d 3e 7a 50 61 74 68 29 3b  ee(pCur->zPath);
126d0 0a 20 20 70 43 75 72 2d 3e 7a 50 61 74 68 20 3d  .  pCur->zPath =
126e0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
126f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12700 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   Return values o
12710 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 68  f columns for th
12720 65 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74  e row at which t
12730 68 65 20 73 65 72 69 65 73 5f 63 75 72 73 6f 72  he series_cursor
12740 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
12750 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 73 74   pointing..*/.st
12760 61 74 69 63 20 69 6e 74 20 66 73 64 69 72 43 6f  atic int fsdirCo
12770 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  lumn(.  sqlite3_
12780 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
12790 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  ,   /* The curso
127a0 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  r */.  sqlite3_c
127b0 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 20 20 20  ontext *ctx,    
127c0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
127d0 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 5f  ment to sqlite3_
127e0 72 65 73 75 6c 74 5f 2e 2e 2e 28 29 20 2a 2f 0a  result_...() */.
127f0 20 20 69 6e 74 20 69 20 20 20 20 20 20 20 20 20    int i         
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12810 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20 74 6f   Which column to
12820 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20   return */.){.  
12830 66 73 64 69 72 5f 63 75 72 73 6f 72 20 2a 70 43  fsdir_cursor *pC
12840 75 72 20 3d 20 28 66 73 64 69 72 5f 63 75 72 73  ur = (fsdir_curs
12850 6f 72 2a 29 63 75 72 3b 0a 20 20 73 77 69 74 63  or*)cur;.  switc
12860 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65  h( i ){.    case
12870 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e 5f 4e 41   FSDIR_COLUMN_NA
12880 4d 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ME: {.      sqli
12890 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
128a0 63 74 78 2c 20 26 70 43 75 72 2d 3e 7a 50 61 74  ctx, &pCur->zPat
128b0 68 5b 70 43 75 72 2d 3e 6e 42 61 73 65 5d 2c 20  h[pCur->nBase], 
128c0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
128d0 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
128e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
128f0 61 73 65 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e  ase FSDIR_COLUMN
12900 5f 4d 4f 44 45 3a 0a 20 20 20 20 20 20 73 71 6c  _MODE:.      sql
12910 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
12920 34 28 63 74 78 2c 20 70 43 75 72 2d 3e 73 53 74  4(ctx, pCur->sSt
12930 61 74 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20  at.st_mode);.   
12940 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
12950 61 73 65 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e  ase FSDIR_COLUMN
12960 5f 4d 54 49 4d 45 3a 0a 20 20 20 20 20 20 73 71  _MTIME:.      sq
12970 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
12980 36 34 28 63 74 78 2c 20 70 43 75 72 2d 3e 73 53  64(ctx, pCur->sS
12990 74 61 74 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20  tat.st_mtime);. 
129a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
129b0 20 63 61 73 65 20 46 53 44 49 52 5f 43 4f 4c 55   case FSDIR_COLU
129c0 4d 4e 5f 44 41 54 41 3a 20 7b 0a 20 20 20 20 20  MN_DATA: {.     
129d0 20 6d 6f 64 65 5f 74 20 6d 20 3d 20 70 43 75 72   mode_t m = pCur
129e0 2d 3e 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 3b  ->sStat.st_mode;
129f0 0a 20 20 20 20 20 20 69 66 28 20 53 5f 49 53 44  .      if( S_ISD
12a00 49 52 28 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  IR(m) ){.       
12a10 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
12a20 6e 75 6c 6c 28 63 74 78 29 3b 0a 23 69 66 20 21  null(ctx);.#if !
12a30 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
12a40 26 26 20 21 64 65 66 69 6e 65 64 28 57 49 4e 33  && !defined(WIN3
12a50 32 29 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  2).      }else i
12a60 66 28 20 53 5f 49 53 4c 4e 4b 28 6d 29 20 29 7b  f( S_ISLNK(m) ){
12a70 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 61 53  .        char aS
12a80 74 61 74 69 63 5b 36 34 5d 3b 0a 20 20 20 20 20  tatic[64];.     
12a90 20 20 20 63 68 61 72 20 2a 61 42 75 66 20 3d 20     char *aBuf = 
12aa0 61 53 74 61 74 69 63 3b 0a 20 20 20 20 20 20 20  aStatic;.       
12ab0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
12ac0 42 75 66 20 3d 20 36 34 3b 0a 20 20 20 20 20 20  Buf = 64;.      
12ad0 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20 20    int n;..      
12ae0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
12af0 20 20 20 20 20 20 20 20 6e 20 3d 20 72 65 61 64          n = read
12b00 6c 69 6e 6b 28 70 43 75 72 2d 3e 7a 50 61 74 68  link(pCur->zPath
12b10 2c 20 61 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , aBuf, nBuf);. 
12b20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3c 6e           if( n<n
12b30 42 75 66 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Buf ) break;.   
12b40 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66 21         if( aBuf!
12b50 3d 61 53 74 61 74 69 63 20 29 20 73 71 6c 69 74  =aStatic ) sqlit
12b60 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a 20  e3_free(aBuf);. 
12b70 20 20 20 20 20 20 20 20 20 6e 42 75 66 20 3d 20           nBuf = 
12b80 6e 42 75 66 2a 32 3b 0a 20 20 20 20 20 20 20 20  nBuf*2;.        
12b90 20 20 61 42 75 66 20 3d 20 73 71 6c 69 74 65 33    aBuf = sqlite3
12ba0 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 75 66 29 3b  _malloc64(nBuf);
12bb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
12bc0 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
12bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
12be0 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
12bf0 28 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20  (ctx);.         
12c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12c10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
12c20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
12c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
12c40 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20  esult_text(ctx, 
12c50 61 42 75 66 2c 20 6e 2c 20 53 51 4c 49 54 45 5f  aBuf, n, SQLITE_
12c60 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
12c70 20 20 20 20 69 66 28 20 61 42 75 66 21 3d 61 53      if( aBuf!=aS
12c80 74 61 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f  tatic ) sqlite3_
12c90 66 72 65 65 28 61 42 75 66 29 3b 0a 23 65 6e 64  free(aBuf);.#end
12ca0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
12cb0 20 20 20 20 20 20 20 20 72 65 61 64 46 69 6c 65          readFile
12cc0 43 6f 6e 74 65 6e 74 73 28 63 74 78 2c 20 70 43  Contents(ctx, pC
12cd0 75 72 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  ur->zPath);.    
12ce0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 61    }.    }.    ca
12cf0 73 65 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e 5f  se FSDIR_COLUMN_
12d00 50 41 54 48 3a 0a 20 20 20 20 64 65 66 61 75 6c  PATH:.    defaul
12d10 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  t: {.      /* Th
12d20 65 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e 5f 50  e FSDIR_COLUMN_P
12d30 41 54 48 20 61 6e 64 20 46 53 44 49 52 5f 43 4f  ATH and FSDIR_CO
12d40 4c 55 4d 4e 5f 44 49 52 20 61 72 65 20 69 6e 70  LUMN_DIR are inp
12d50 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ut parameters.. 
12d60 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 72       ** always r
12d70 65 74 75 72 6e 20 74 68 65 69 72 20 76 61 6c 75  eturn their valu
12d80 65 73 20 61 73 20 4e 55 4c 4c 20 2a 2f 0a 20 20  es as NULL */.  
12d90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12da0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12db0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12dc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
12dd0 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  id for the curre
12de0 6e 74 20 72 6f 77 2e 20 49 6e 20 74 68 69 73 20  nt row. In this 
12df0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20  implementation, 
12e00 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 72 6f 77  the.** first row
12e10 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 73 73   returned is ass
12e20 69 67 6e 65 64 20 72 6f 77 69 64 20 76 61 6c 75  igned rowid valu
12e30 65 20 31 2c 20 61 6e 64 20 65 61 63 68 20 73 75  e 1, and each su
12e40 62 73 65 71 75 65 6e 74 0a 2a 2a 20 72 6f 77 20  bsequent.** row 
12e50 61 20 76 61 6c 75 65 20 31 20 6d 6f 72 65 20 74  a value 1 more t
12e60 68 61 6e 20 74 68 61 74 20 6f 66 20 74 68 65 20  han that of the 
12e70 70 72 65 76 69 6f 75 73 2e 0a 2a 2f 0a 73 74 61  previous..*/.sta
12e80 74 69 63 20 69 6e 74 20 66 73 64 69 72 52 6f 77  tic int fsdirRow
12e90 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
12ea0 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c  cursor *cur, sql
12eb0 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
12ec0 64 29 7b 0a 20 20 66 73 64 69 72 5f 63 75 72 73  d){.  fsdir_curs
12ed0 6f 72 20 2a 70 43 75 72 20 3d 20 28 66 73 64 69  or *pCur = (fsdi
12ee0 72 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  r_cursor*)cur;. 
12ef0 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d   *pRowid = pCur-
12f00 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72  >iRowid;.  retur
12f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12f20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
12f30 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
12f40 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 6f  has been moved o
12f50 66 66 20 6f 66 20 74 68 65 20 6c 61 73 74 0a 2a  ff of the last.*
12f60 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  * row of output.
12f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
12f80 73 64 69 72 45 6f 66 28 73 71 6c 69 74 65 33 5f  sdirEof(sqlite3_
12f90 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
12fa0 29 7b 0a 20 20 66 73 64 69 72 5f 63 75 72 73 6f  ){.  fsdir_curso
12fb0 72 20 2a 70 43 75 72 20 3d 20 28 66 73 64 69 72  r *pCur = (fsdir
12fc0 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  _cursor*)cur;.  
12fd0 72 65 74 75 72 6e 20 28 70 43 75 72 2d 3e 7a 50  return (pCur->zP
12fe0 61 74 68 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ath==0);.}../*.*
12ff0 2a 20 78 46 69 6c 74 65 72 20 63 61 6c 6c 62 61  * xFilter callba
13000 63 6b 2e 0a 2a 2a 0a 2a 2a 20 69 64 78 4e 75 6d  ck..**.** idxNum
13010 3d 3d 31 20 20 20 50 41 54 48 20 70 61 72 61 6d  ==1   PATH param
13020 65 74 65 72 20 6f 6e 6c 79 0a 2a 2a 20 69 64 78  eter only.** idx
13030 4e 75 6d 3d 3d 32 20 20 20 42 6f 74 68 20 50 41  Num==2   Both PA
13040 54 48 20 61 6e 64 20 44 49 52 20 73 75 70 70 6c  TH and DIR suppl
13050 69 65 64 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ied.*/.static in
13060 74 20 66 73 64 69 72 46 69 6c 74 65 72 28 0a 20  t fsdirFilter(. 
13070 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13080 72 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e  rsor *cur, .  in
13090 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
130a0 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
130b0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
130c0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
130d0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
130e0 7a 44 69 72 20 3d 20 30 3b 0a 20 20 66 73 64 69  zDir = 0;.  fsdi
130f0 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  r_cursor *pCur =
13100 20 28 66 73 64 69 72 5f 63 75 72 73 6f 72 2a 29   (fsdir_cursor*)
13110 63 75 72 3b 0a 20 20 28 76 6f 69 64 29 69 64 78  cur;.  (void)idx
13120 53 74 72 3b 0a 20 20 66 73 64 69 72 52 65 73 65  Str;.  fsdirRese
13130 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 0a  tCursor(pCur);..
13140 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 30 20    if( idxNum==0 
13150 29 7b 0a 20 20 20 20 66 73 64 69 72 53 65 74 45  ){.    fsdirSetE
13160 72 72 6d 73 67 28 70 43 75 72 2c 20 22 74 61 62  rrmsg(pCur, "tab
13170 6c 65 20 66 75 6e 63 74 69 6f 6e 20 66 73 64 69  le function fsdi
13180 72 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  r requires an ar
13190 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 72 65  gument");.    re
131a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
131b0 52 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  R;.  }..  assert
131c0 28 20 61 72 67 63 3d 3d 69 64 78 4e 75 6d 20 26  ( argc==idxNum &
131d0 26 20 28 61 72 67 63 3d 3d 31 20 7c 7c 20 61 72  & (argc==1 || ar
131e0 67 63 3d 3d 32 29 20 29 3b 0a 20 20 7a 44 69 72  gc==2) );.  zDir
131f0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
13200 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13210 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
13220 66 28 20 7a 44 69 72 3d 3d 30 20 29 7b 0a 20 20  f( zDir==0 ){.  
13230 20 20 66 73 64 69 72 53 65 74 45 72 72 6d 73 67    fsdirSetErrmsg
13240 28 70 43 75 72 2c 20 22 74 61 62 6c 65 20 66 75  (pCur, "table fu
13250 6e 63 74 69 6f 6e 20 66 73 64 69 72 20 72 65 71  nction fsdir req
13260 75 69 72 65 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  uires a non-NULL
13270 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20   argument");.   
13280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
13290 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
132a0 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 70  argc==2 ){.    p
132b0 43 75 72 2d 3e 7a 42 61 73 65 20 3d 20 28 63 6f  Cur->zBase = (co
132c0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
132d0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
132e0 76 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  v[1]);.  }.  if(
132f0 20 70 43 75 72 2d 3e 7a 42 61 73 65 20 29 7b 0a   pCur->zBase ){.
13300 20 20 20 20 70 43 75 72 2d 3e 6e 42 61 73 65 20      pCur->nBase 
13310 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 43  = (int)strlen(pC
13320 75 72 2d 3e 7a 42 61 73 65 29 2b 31 3b 0a 20 20  ur->zBase)+1;.  
13330 20 20 70 43 75 72 2d 3e 7a 50 61 74 68 20 3d 20    pCur->zPath = 
13340 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13350 22 25 73 2f 25 73 22 2c 20 70 43 75 72 2d 3e 7a  "%s/%s", pCur->z
13360 42 61 73 65 2c 20 7a 44 69 72 29 3b 0a 20 20 7d  Base, zDir);.  }
13370 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
13380 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f  zPath = sqlite3_
13390 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 44  mprintf("%s", zD
133a0 69 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ir);.  }..  if( 
133b0 70 43 75 72 2d 3e 7a 50 61 74 68 3d 3d 30 20 29  pCur->zPath==0 )
133c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
133d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
133e0 20 69 66 28 20 66 69 6c 65 4c 69 6e 6b 53 74 61   if( fileLinkSta
133f0 74 28 70 43 75 72 2d 3e 7a 50 61 74 68 2c 20 26  t(pCur->zPath, &
13400 70 43 75 72 2d 3e 73 53 74 61 74 29 20 29 7b 0a  pCur->sStat) ){.
13410 20 20 20 20 66 73 64 69 72 53 65 74 45 72 72 6d      fsdirSetErrm
13420 73 67 28 70 43 75 72 2c 20 22 63 61 6e 6e 6f 74  sg(pCur, "cannot
13430 20 73 74 61 74 20 66 69 6c 65 3a 20 25 73 22 2c   stat file: %s",
13440 20 70 43 75 72 2d 3e 7a 50 61 74 68 29 3b 0a 20   pCur->zPath);. 
13450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13460 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
13470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65  .}../*.** SQLite
13490 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69   will invoke thi
134a0 73 20 6d 65 74 68 6f 64 20 6f 6e 65 20 6f 72 20  s method one or 
134b0 6d 6f 72 65 20 74 69 6d 65 73 20 77 68 69 6c 65  more times while
134c0 20 70 6c 61 6e 6e 69 6e 67 20 61 20 71 75 65 72   planning a quer
134d0 79 0a 2a 2a 20 74 68 61 74 20 75 73 65 73 20 74  y.** that uses t
134e0 68 65 20 67 65 6e 65 72 61 74 65 5f 73 65 72 69  he generate_seri
134f0 65 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  es virtual table
13500 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
13510 6e 65 65 64 73 20 74 6f 20 63 72 65 61 74 65 0a  needs to create.
13520 2a 2a 20 61 20 71 75 65 72 79 20 70 6c 61 6e 20  ** a query plan 
13530 66 6f 72 20 65 61 63 68 20 69 6e 76 6f 63 61 74  for each invocat
13540 69 6f 6e 20 61 6e 64 20 63 6f 6d 70 75 74 65 20  ion and compute 
13550 61 6e 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73  an estimated cos
13560 74 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20 70 6c  t for that.** pl
13570 61 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  an..**.** In thi
13580 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
13590 20 69 64 78 4e 75 6d 20 69 73 20 75 73 65 64 20   idxNum is used 
135a0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
135b0 0a 2a 2a 20 71 75 65 72 79 20 70 6c 61 6e 2e 20  .** query plan. 
135c0 20 69 64 78 53 74 72 20 69 73 20 75 6e 75 73 65   idxStr is unuse
135d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65  d..**.** The que
135e0 72 79 20 70 6c 61 6e 20 69 73 20 72 65 70 72 65  ry plan is repre
135f0 73 65 6e 74 65 64 20 62 79 20 76 61 6c 75 65 73  sented by values
13600 20 6f 66 20 69 64 78 4e 75 6d 3a 0a 2a 2a 0a 2a   of idxNum:.**.*
13610 2a 20 20 28 31 29 20 20 54 68 65 20 70 61 74 68  *  (1)  The path
13620 20 76 61 6c 75 65 20 69 73 20 73 75 70 70 6c 69   value is suppli
13630 65 64 20 62 79 20 61 72 67 76 5b 30 5d 0a 2a 2a  ed by argv[0].**
13640 20 20 28 32 29 20 20 50 61 74 68 20 69 73 20 69    (2)  Path is i
13650 6e 20 61 72 67 76 5b 30 5d 20 61 6e 64 20 64 69  n argv[0] and di
13660 72 20 69 73 20 69 6e 20 61 72 67 76 5b 31 5d 0a  r is in argv[1].
13670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 73  */.static int fs
13680 64 69 72 42 65 73 74 49 6e 64 65 78 28 0a 20 20  dirBestIndex(.  
13690 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
136a0 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b,.  sqlite3_ind
136b0 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
136c0 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  o.){.  int i;   
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
136e0 20 4c 6f 6f 70 20 6f 76 65 72 20 63 6f 6e 73 74   Loop over const
136f0 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  raints */.  int 
13700 69 64 78 50 61 74 68 20 3d 20 2d 31 3b 20 20 20  idxPath = -1;   
13710 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
13720 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
13730 61 69 6e 74 20 6f 66 20 50 41 54 48 3d 20 2a 2f  aint of PATH= */
13740 0a 20 20 69 6e 74 20 69 64 78 44 69 72 20 3d 20  .  int idxDir = 
13750 2d 31 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  -1;       /* Ind
13760 65 78 20 69 6e 20 70 49 64 78 49 6e 66 6f 2d 3e  ex in pIdxInfo->
13770 61 43 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 44  aConstraint of D
13780 49 52 3d 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  IR= */.  int see
13790 6e 50 61 74 68 20 3d 20 30 3b 20 20 20 20 20 20  nPath = 0;      
137a0 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 75 6e  /* True if an un
137b0 75 73 61 62 6c 65 20 50 41 54 48 3d 20 63 6f 6e  usable PATH= con
137c0 73 74 72 61 69 6e 74 20 69 73 20 73 65 65 6e 20  straint is seen 
137d0 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6e 44 69 72  */.  int seenDir
137e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
137f0 72 75 65 20 69 66 20 61 6e 20 75 6e 75 73 61 62  rue if an unusab
13800 6c 65 20 44 49 52 3d 20 63 6f 6e 73 74 72 61 69  le DIR= constrai
13810 6e 74 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  nt is seen */.  
13820 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
13830 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
13840 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
13850 6e 74 3b 0a 0a 20 20 28 76 6f 69 64 29 74 61 62  nt;..  (void)tab
13860 3b 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  pConstraint 
13870 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
13880 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
13890 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
138a0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
138b0 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29  , pConstraint++)
138c0 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74  {.    if( pConst
138d0 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c 49 54  raint->op!=SQLIT
138e0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
138f0 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e 75 65  NT_EQ ) continue
13900 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 43  ;.    switch( pC
13910 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
13920 6d 6e 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  mn ){.      case
13930 20 46 53 44 49 52 5f 43 4f 4c 55 4d 4e 5f 50 41   FSDIR_COLUMN_PA
13940 54 48 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TH: {.        if
13950 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
13960 73 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  sable ){.       
13970 20 20 20 69 64 78 50 61 74 68 20 3d 20 69 3b 0a     idxPath = i;.
13980 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 50 61            seenPa
13990 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  th = 0;.        
139a0 7d 65 6c 73 65 20 69 66 28 20 69 64 78 50 61 74  }else if( idxPat
139b0 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  h<0 ){.         
139c0 20 73 65 65 6e 50 61 74 68 20 3d 20 31 3b 0a 20   seenPath = 1;. 
139d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
139e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
139f0 20 20 20 20 20 20 63 61 73 65 20 46 53 44 49 52        case FSDIR
13a00 5f 43 4f 4c 55 4d 4e 5f 44 49 52 3a 20 7b 0a 20  _COLUMN_DIR: {. 
13a10 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73         if( pCons
13a20 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 20 29  traint->usable )
13a30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 64 78 44  {.          idxD
13a40 69 72 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ir = i;.        
13a50 20 20 73 65 65 6e 44 69 72 20 3d 20 30 3b 0a 20    seenDir = 0;. 
13a60 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13a70 20 69 64 78 44 69 72 3c 30 20 29 7b 0a 20 20 20   idxDir<0 ){.   
13a80 20 20 20 20 20 20 20 73 65 65 6e 44 69 72 20 3d         seenDir =
13a90 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
13aa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13ab0 20 20 20 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a     }.    } .  }.
13ac0 20 20 69 66 28 20 73 65 65 6e 50 61 74 68 20 7c    if( seenPath |
13ad0 7c 20 73 65 65 6e 44 69 72 20 29 7b 0a 20 20 20  | seenDir ){.   
13ae0 20 2f 2a 20 49 66 20 69 6e 70 75 74 20 70 61 72   /* If input par
13af0 61 6d 65 74 65 72 73 20 61 72 65 20 75 6e 75 73  ameters are unus
13b00 61 62 6c 65 2c 20 64 69 73 61 6c 6c 6f 77 20 74  able, disallow t
13b10 68 69 73 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20  his plan */.    
13b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13b30 4e 53 54 52 41 49 4e 54 3b 0a 20 20 7d 0a 0a 20  NSTRAINT;.  }.. 
13b40 20 69 66 28 20 69 64 78 50 61 74 68 3c 30 20 29   if( idxPath<0 )
13b50 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
13b60 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
13b70 2f 2a 20 54 68 65 20 70 49 64 78 49 6e 66 6f 2d  /* The pIdxInfo-
13b80 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 73  >estimatedCost s
13b90 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
13ba0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
13bb0 20 68 75 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   huge.    ** num
13bc0 62 65 72 2e 20 20 4c 65 61 76 65 20 69 74 20 75  ber.  Leave it u
13bd0 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20 20  nchanged. */.   
13be0 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
13bf0 61 74 65 64 52 6f 77 73 20 3d 20 30 78 37 66 66  atedRows = 0x7ff
13c00 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fffff;.  }else{.
13c10 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
13c20 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
13c30 64 78 50 61 74 68 5d 2e 6f 6d 69 74 20 3d 20 31  dxPath].omit = 1
13c40 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
13c50 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13c60 5b 69 64 78 50 61 74 68 5d 2e 61 72 67 76 49 6e  [idxPath].argvIn
13c70 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  dex = 1;.    if(
13c80 20 69 64 78 44 69 72 3e 3d 30 20 29 7b 0a 20 20   idxDir>=0 ){.  
13c90 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
13ca0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
13cb0 64 78 44 69 72 5d 2e 6f 6d 69 74 20 3d 20 31 3b  dxDir].omit = 1;
13cc0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
13cd0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13ce0 65 5b 69 64 78 44 69 72 5d 2e 61 72 67 76 49 6e  e[idxDir].argvIn
13cf0 64 65 78 20 3d 20 32 3b 0a 20 20 20 20 20 20 70  dex = 2;.      p
13d00 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
13d10 3d 20 32 3b 0a 20 20 20 20 20 20 70 49 64 78 49  = 2;.      pIdxI
13d20 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
13d30 73 74 20 3d 20 31 30 2e 30 3b 0a 20 20 20 20 7d  st = 10.0;.    }
13d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78  else{.      pIdx
13d50 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31  Info->idxNum = 1
13d60 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
13d70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
13d80 3d 20 31 30 30 2e 30 3b 0a 20 20 20 20 7d 0a 20  = 100.0;.    }. 
13d90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
13da0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13db0 20 52 65 67 69 73 74 65 72 20 74 68 65 20 22 66   Register the "f
13dc0 73 64 69 72 22 20 76 69 72 74 75 61 6c 20 74 61  sdir" virtual ta
13dd0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
13de0 6e 74 20 66 73 64 69 72 52 65 67 69 73 74 65 72  nt fsdirRegister
13df0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
13e00 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
13e10 6d 6f 64 75 6c 65 20 66 73 64 69 72 4d 6f 64 75  module fsdirModu
13e20 6c 65 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20 20  le = {.    0,   
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
13e50 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  n */.    0,     
13e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e70 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a      /* xCreate *
13e80 2f 0a 20 20 20 20 66 73 64 69 72 43 6f 6e 6e 65  /.    fsdirConne
13e90 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
13ea0 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a   /* xConnect */.
13eb0 20 20 20 20 66 73 64 69 72 42 65 73 74 49 6e 64      fsdirBestInd
13ec0 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ex,            /
13ed0 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  * xBestIndex */.
13ee0 20 20 20 20 66 73 64 69 72 44 69 73 63 6f 6e 6e      fsdirDisconn
13ef0 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ect,           /
13f00 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f  * xDisconnect */
13f10 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20  /* xDestroy */. 
13f40 20 20 20 66 73 64 69 72 4f 70 65 6e 2c 20 20 20     fsdirOpen,   
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f60 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
13f70 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 66 73  cursor */.    fs
13f80 64 69 72 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  dirClose,       
13f90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
13fa0 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
13fb0 73 6f 72 20 2a 2f 0a 20 20 20 20 66 73 64 69 72  sor */.    fsdir
13fc0 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
13fd0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
13fe0 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
13ff0 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
14000 0a 20 20 20 20 66 73 64 69 72 4e 65 78 74 2c 20  .    fsdirNext, 
14010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14020 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e  /* xNext - advan
14030 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  ce a cursor */. 
14040 20 20 20 66 73 64 69 72 45 6f 66 2c 20 20 20 20     fsdirEof,    
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14060 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f   xEof - check fo
14070 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f  r end of scan */
14080 0a 20 20 20 20 66 73 64 69 72 43 6f 6c 75 6d 6e  .    fsdirColumn
14090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
140a0 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
140b0 64 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 66 73  d data */.    fs
140c0 64 69 72 52 6f 77 69 64 2c 20 20 20 20 20 20 20  dirRowid,       
140d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
140e0 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
140f0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14110 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20   /* xUpdate */. 
14120 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14140 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 20 20 30   xBegin */.    0
14150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
14170 6e 63 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  nc */.    0,    
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
141a0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
141b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141c0 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a    /* xRollback *
141d0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20   /* xFindMethod 
14200 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
14230 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14250 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  * xSavepoint */.
14260 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14280 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20  * xRelease */.  
14290 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
142b0 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20  xRollbackTo */. 
142c0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
142e0 20 78 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a   xShadowName */.
142f0 20 20 7d 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d    };..  int rc =
14300 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
14310 6d 6f 64 75 6c 65 28 64 62 2c 20 22 66 73 64 69  module(db, "fsdi
14320 72 22 2c 20 26 66 73 64 69 72 4d 6f 64 75 6c 65  r", &fsdirModule
14330 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , 0);.  return r
14340 63 3b 0a 7d 0a 23 65 6c 73 65 20 20 20 20 20 20  c;.}.#else      
14350 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
14360 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
14370 2f 0a 23 20 64 65 66 69 6e 65 20 66 73 64 69 72  /.# define fsdir
14380 52 65 67 69 73 74 65 72 28 78 29 20 53 51 4c 49  Register(x) SQLI
14390 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
143a0 66 64 65 66 20 5f 57 49 4e 33 32 0a 0a 23 65 6e  fdef _WIN32..#en
143b0 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  dif.int sqlite3_
143c0 66 69 6c 65 69 6f 5f 69 6e 69 74 28 0a 20 20 73  fileio_init(.  s
143d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
143e0 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
143f0 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
14400 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
14410 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Api.){.  int rc 
14420 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53  = SQLITE_OK;.  S
14430 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
14440 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28  INIT2(pApi);.  (
14450 76 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20  void)pzErrMsg;  
14460 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65  /* Unused parame
14470 74 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ter */.  rc = sq
14480 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
14490 63 74 69 6f 6e 28 64 62 2c 20 22 72 65 61 64 66  ction(db, "readf
144a0 69 6c 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ile", 1, SQLITE_
144b0 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 20 20 20 20 72 65 61 64 66 69 6c 65          readfile
144e0 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
144f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14500 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14510 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14520 74 69 6f 6e 28 64 62 2c 20 22 77 72 69 74 65 66  tion(db, "writef
14530 69 6c 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  ile", -1, SQLITE
14540 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65             write
14570 66 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b  fileFunc, 0, 0);
14580 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
14590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
145a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
145b0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
145c0 20 22 6c 73 6d 6f 64 65 22 2c 20 31 2c 20 53 51   "lsmode", 1, SQ
145d0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
14600 73 4d 6f 64 65 46 75 6e 63 2c 20 30 2c 20 30 29  sModeFunc, 0, 0)
14610 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
14620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14630 20 72 63 20 3d 20 66 73 64 69 72 52 65 67 69 73   rc = fsdirRegis
14640 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72  ter(db);.  }.  r
14650 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14670 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 2e 2e 2f 65  ******* End ../e
14680 78 74 2f 6d 69 73 63 2f 66 69 6c 65 69 6f 2e 63  xt/misc/fileio.c
14690 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
146a0 2a 2a 2a 2a 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  *****/./********
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 20 42 65 67 69 6e 20 2e 2e 2f 65 78 74 2f 6d  * Begin ../ext/m
146d0 69 73 63 2f 63 6f 6d 70 6c 65 74 69 6f 6e 2e 63  isc/completion.c
146e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
146f0 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 32 30 31 37 2d  ***/./*.** 2017-
14700 30 37 2d 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20  07-10.**.** The 
14710 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
14720 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
14730 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
14740 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
14750 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
14760 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
14770 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
14780 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
14790 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
147a0 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
147b0 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
147c0 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
147d0 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
147e0 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
147f0 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
14800 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
14810 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
14820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14860 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
14870 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
14880 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
14890 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
148a0 72 65 74 75 72 6e 73 20 73 75 67 67 65 73 74 65  returns suggeste
148b0 64 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 73  d.** completions
148c0 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 53   for a partial S
148d0 51 4c 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  QL input..**.** 
148e0 53 75 67 67 65 73 74 65 64 20 75 73 61 67 65 3a  Suggested usage:
148f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
14900 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69  T DISTINCT candi
14910 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  date COLLATE noc
14920 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 46 52 4f  ase.**       FRO
14930 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 24 70 72  M completion($pr
14940 65 66 69 78 2c 24 77 68 6f 6c 65 6c 69 6e 65 29  efix,$wholeline)
14950 0a 2a 2a 20 20 20 20 20 20 4f 52 44 45 52 20 42  .**      ORDER B
14960 59 20 31 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  Y 1;.**.** The t
14970 77 6f 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  wo query paramet
14980 65 72 73 20 61 72 65 20 6f 70 74 69 6f 6e 61 6c  ers are optional
14990 2e 20 20 24 70 72 65 66 69 78 20 69 73 20 74 68  .  $prefix is th
149a0 65 20 74 65 78 74 20 6f 66 20 74 68 65 0a 2a 2a  e text of the.**
149b0 20 63 75 72 72 65 6e 74 20 77 6f 72 64 20 62 65   current word be
149c0 69 6e 67 20 74 79 70 65 64 20 61 6e 64 20 74 68  ing typed and th
149d0 61 74 20 69 73 20 74 6f 20 62 65 20 63 6f 6d 70  at is to be comp
149e0 6c 65 74 65 64 2e 20 20 24 77 68 6f 6c 65 6c 69  leted.  $wholeli
149f0 6e 65 20 69 73 0a 2a 2a 20 74 68 65 20 63 6f 6d  ne is.** the com
14a00 70 6c 65 74 65 20 69 6e 70 75 74 20 6c 69 6e 65  plete input line
14a10 2c 20 75 73 65 64 20 66 6f 72 20 63 6f 6e 74 65  , used for conte
14a20 78 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 61  xt..**.** The ra
14a30 77 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 29 20 74  w completion() t
14a40 61 62 6c 65 20 6d 69 67 68 74 20 72 65 74 75 72  able might retur
14a50 6e 20 74 68 65 20 73 61 6d 65 20 63 61 6e 64 69  n the same candi
14a60 64 61 74 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  date multiple.**
14a70 20 74 69 6d 65 73 2c 20 66 6f 72 20 65 78 61 6d   times, for exam
14a80 70 6c 65 20 69 66 20 74 68 65 20 73 61 6d 65 20  ple if the same 
14a90 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75  column name is u
14aa0 73 65 64 20 74 6f 20 74 77 6f 20 6f 72 20 6d 6f  sed to two or mo
14ab0 72 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 20 41  re.** tables.  A
14ac0 6e 64 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  nd the candidate
14ad0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 69  s are returned i
14ae0 6e 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6f  n an arbitrary o
14af0 72 64 65 72 2e 20 20 48 65 6e 63 65 2c 0a 2a 2a  rder.  Hence,.**
14b00 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 61 6e   the DISTINCT an
14b10 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20 72  d ORDER BY are r
14b20 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2a 0a 2a  ecommended..**.*
14b30 2a 20 54 68 69 73 20 76 69 72 74 75 61 6c 20 74  * This virtual t
14b40 61 62 6c 65 20 6f 70 65 72 61 74 65 73 20 61 74  able operates at
14b50 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 68 75   the speed of hu
14b60 6d 61 6e 20 74 79 70 69 6e 67 2c 20 61 6e 64 20  man typing, and 
14b70 73 6f 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 6e  so there.** is n
14b80 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b  o attempt to mak
14b90 65 20 69 74 20 66 61 73 74 2e 20 20 45 76 65 6e  e it fast.  Even
14ba0 20 61 20 73 6c 6f 77 20 69 6d 70 6c 65 6d 65 6e   a slow implemen
14bb0 74 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6d  tation will be m
14bc0 75 63 68 0a 2a 2a 20 66 61 73 74 65 72 20 74 68  uch.** faster th
14bd0 61 6e 20 61 6e 79 20 68 75 6d 61 6e 20 63 61 6e  an any human can
14be0 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2f 0a 53 51 4c   type..**.*/.SQL
14bf0 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
14c00 49 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73  IT1.#include <as
14c10 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  sert.h>.#include
14c20 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63   <string.h>.#inc
14c30 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
14c40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c50 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14c60 0a 0a 2f 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f  ../* completion_
14c70 76 74 61 62 20 69 73 20 61 20 73 75 62 63 6c 61  vtab is a subcla
14c80 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 74  ss of sqlite3_vt
14c90 61 62 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  ab which will.**
14ca0 20 73 65 72 76 65 20 61 73 20 74 68 65 20 75 6e   serve as the un
14cb0 64 65 72 6c 79 69 6e 67 20 72 65 70 72 65 73 65  derlying represe
14cc0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 63 6f 6d  ntation of a com
14cd0 70 6c 65 74 69 6f 6e 20 76 69 72 74 75 61 6c 20  pletion virtual 
14ce0 74 61 62 6c 65 0a 2a 2f 0a 74 79 70 65 64 65 66  table.*/.typedef
14cf0 20 73 74 72 75 63 74 20 63 6f 6d 70 6c 65 74 69   struct completi
14d00 6f 6e 5f 76 74 61 62 20 63 6f 6d 70 6c 65 74 69  on_vtab completi
14d10 6f 6e 5f 76 74 61 62 3b 0a 73 74 72 75 63 74 20  on_vtab;.struct 
14d20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 76 74 61 62 20  completion_vtab 
14d30 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
14d40 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20   base;  /* Base 
14d50 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
14d60 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
14d70 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 2f  e3 *db;        /
14d80 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
14d90 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 63  ction for this c
14da0 6f 6d 70 6c 65 74 69 6f 6e 20 76 74 61 62 20 2a  ompletion vtab *
14db0 2f 0a 7d 3b 0a 0a 2f 2a 20 63 6f 6d 70 6c 65 74  /.};../* complet
14dc0 69 6f 6e 5f 63 75 72 73 6f 72 20 69 73 20 61 20  ion_cursor is a 
14dd0 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
14de0 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
14df0 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 73 65  which will.** se
14e00 72 76 65 20 61 73 20 74 68 65 20 75 6e 64 65 72  rve as the under
14e10 6c 79 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  lying representa
14e20 74 69 6f 6e 20 6f 66 20 61 20 63 75 72 73 6f 72  tion of a cursor
14e30 20 74 68 61 74 20 73 63 61 6e 73 0a 2a 2a 20 6f   that scans.** o
14e40 76 65 72 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ver rows of the 
14e50 72 65 73 75 6c 74 0a 2a 2f 0a 74 79 70 65 64 65  result.*/.typede
14e60 66 20 73 74 72 75 63 74 20 63 6f 6d 70 6c 65 74  f struct complet
14e70 69 6f 6e 5f 63 75 72 73 6f 72 20 63 6f 6d 70 6c  ion_cursor compl
14e80 65 74 69 6f 6e 5f 63 75 72 73 6f 72 3b 0a 73 74  etion_cursor;.st
14e90 72 75 63 74 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f  ruct completion_
14ea0 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  cursor {.  sqlit
14eb0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
14ec0 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c  ase;  /* Base cl
14ed0 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69  ass - must be fi
14ee0 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rst */.  sqlite3
14ef0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
14f00 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14f10 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 74  connection for t
14f20 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
14f30 69 6e 74 20 6e 50 72 65 66 69 78 2c 20 6e 4c 69  int nPrefix, nLi
14f40 6e 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ne;        /* Nu
14f50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
14f60 20 7a 50 72 65 66 69 78 20 61 6e 64 20 7a 4c 69   zPrefix and zLi
14f70 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ne */.  char *zP
14f80 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
14f90 20 20 20 2f 2a 20 54 68 65 20 70 72 65 66 69 78     /* The prefix
14fa0 20 66 6f 72 20 74 68 65 20 77 6f 72 64 20 77 65   for the word we
14fb0 20 77 61 6e 74 20 74 6f 20 63 6f 6d 70 6c 65 74   want to complet
14fc0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 69  e */.  char *zLi
14fd0 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
14fe0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 74    /* The whole t
14ff0 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 63  hat we want to c
15000 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 63 6f 6e  omplete */.  con
15010 73 74 20 63 68 61 72 20 2a 7a 43 75 72 72 65 6e  st char *zCurren
15020 74 52 6f 77 3b 20 20 20 2f 2a 20 43 75 72 72 65  tRow;   /* Curre
15030 6e 74 20 6f 75 74 70 75 74 20 72 6f 77 20 2a 2f  nt output row */
15040 0a 20 20 69 6e 74 20 73 7a 52 6f 77 3b 20 20 20  .  int szRow;   
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15060 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
15070 43 75 72 72 65 6e 74 52 6f 77 20 73 74 72 69 6e  CurrentRow strin
15080 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  g */.  sqlite3_s
15090 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
150a0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
150b0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  tement */.  sqli
150c0 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
150d0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ;      /* The ro
150e0 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 65 50 68  wid */.  int ePh
150f0 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
15100 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70      /* Current p
15110 68 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  hase */.  int j;
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 20 20 20 20 20 2f 2a 20 69 6e 74 65 72 2d 70 68       /* inter-ph
15140 61 73 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 7d  ase counter */.}
15150 3b 0a 0a 2f 2a 20 56 61 6c 75 65 73 20 66 6f 72  ;../* Values for
15160 20 65 50 68 61 73 65 3a 0a 2a 2f 0a 23 64 65 66   ePhase:.*/.#def
15170 69 6e 65 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f 46  ine COMPLETION_F
15180 49 52 53 54 5f 50 48 41 53 45 20 20 20 31 0a 23  IRST_PHASE   1.#
15190 64 65 66 69 6e 65 20 43 4f 4d 50 4c 45 54 49 4f  define COMPLETIO
151a0 4e 5f 4b 45 59 57 4f 52 44 53 20 20 20 20 20 20  N_KEYWORDS      
151b0 31 0a 23 64 65 66 69 6e 65 20 43 4f 4d 50 4c 45  1.#define COMPLE
151c0 54 49 4f 4e 5f 50 52 41 47 4d 41 53 20 20 20 20  TION_PRAGMAS    
151d0 20 20 20 32 0a 23 64 65 66 69 6e 65 20 43 4f 4d     2.#define COM
151e0 50 4c 45 54 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e  PLETION_FUNCTION
151f0 53 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20  S     3.#define 
15200 43 4f 4d 50 4c 45 54 49 4f 4e 5f 43 4f 4c 4c 41  COMPLETION_COLLA
15210 54 49 4f 4e 53 20 20 20 20 34 0a 23 64 65 66 69  TIONS    4.#defi
15220 6e 65 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f 49 4e  ne COMPLETION_IN
15230 44 45 58 45 53 20 20 20 20 20 20 20 35 0a 23 64  DEXES       5.#d
15240 65 66 69 6e 65 20 43 4f 4d 50 4c 45 54 49 4f 4e  efine COMPLETION
15250 5f 54 52 49 47 47 45 52 53 20 20 20 20 20 20 36  _TRIGGERS      6
15260 0a 23 64 65 66 69 6e 65 20 43 4f 4d 50 4c 45 54  .#define COMPLET
15270 49 4f 4e 5f 44 41 54 41 42 41 53 45 53 20 20 20  ION_DATABASES   
15280 20 20 37 0a 23 64 65 66 69 6e 65 20 43 4f 4d 50    7.#define COMP
15290 4c 45 54 49 4f 4e 5f 54 41 42 4c 45 53 20 20 20  LETION_TABLES   
152a0 20 20 20 20 20 38 20 20 20 20 2f 2a 20 41 6c 73       8    /* Als
152b0 6f 20 56 49 45 57 73 20 61 6e 64 20 54 52 49 47  o VIEWs and TRIG
152c0 47 45 52 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  GERs */.#define 
152d0 43 4f 4d 50 4c 45 54 49 4f 4e 5f 43 4f 4c 55 4d  COMPLETION_COLUM
152e0 4e 53 20 20 20 20 20 20 20 39 0a 23 64 65 66 69  NS       9.#defi
152f0 6e 65 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f 4d 4f  ne COMPLETION_MO
15300 44 55 4c 45 53 20 20 20 20 20 20 20 31 30 0a 23  DULES       10.#
15310 64 65 66 69 6e 65 20 43 4f 4d 50 4c 45 54 49 4f  define COMPLETIO
15320 4e 5f 45 4f 46 20 20 20 20 20 20 20 20 20 20 20  N_EOF           
15330 31 31 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f  11../*.** The co
15340 6d 70 6c 65 74 69 6f 6e 43 6f 6e 6e 65 63 74 28  mpletionConnect(
15350 29 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f  ) method is invo
15360 6b 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  ked to create a 
15370 6e 65 77 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f  new.** completio
15380 6e 5f 76 74 61 62 20 74 68 61 74 20 64 65 73 63  n_vtab that desc
15390 72 69 62 65 73 20 74 68 65 20 63 6f 6d 70 6c 65  ribes the comple
153a0 74 69 6f 6e 20 76 69 72 74 75 61 6c 20 74 61 62  tion virtual tab
153b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 6e 6b 20  le..**.** Think 
153c0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
153d0 61 73 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  as the construct
153e0 6f 72 20 66 6f 72 20 63 6f 6d 70 6c 65 74 69 6f  or for completio
153f0 6e 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 2e 0a  n_vtab objects..
15400 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72  **.** All this r
15410 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
15420 64 6f 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  do is:.**.**    
15430 28 31 29 20 41 6c 6c 6f 63 61 74 65 20 74 68 65  (1) Allocate the
15440 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 76 74 61 62   completion_vtab
15450 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 6e 69 74   object and init
15460 69 61 6c 69 7a 65 20 61 6c 6c 20 66 69 65 6c 64  ialize all field
15470 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  s..**.**    (2) 
15480 54 65 6c 6c 20 53 51 4c 69 74 65 20 28 76 69 61  Tell SQLite (via
15490 20 74 68 65 20 73 71 6c 69 74 65 33 5f 64 65 63   the sqlite3_dec
154a0 6c 61 72 65 5f 76 74 61 62 28 29 20 69 6e 74 65  lare_vtab() inte
154b0 72 66 61 63 65 29 20 77 68 61 74 20 74 68 65 0a  rface) what the.
154c0 2a 2a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74  **        result
154d0 20 73 65 74 20 6f 66 20 71 75 65 72 69 65 73 20   set of queries 
154e0 61 67 61 69 6e 73 74 20 63 6f 6d 70 6c 65 74 69  against completi
154f0 6f 6e 20 77 69 6c 6c 20 6c 6f 6f 6b 20 6c 69 6b  on will look lik
15500 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15510 20 63 6f 6d 70 6c 65 74 69 6f 6e 43 6f 6e 6e 65   completionConne
15520 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
15530 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
15540 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
15550 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
15560 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
15570 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20  tab **ppVtab,.  
15580 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
15590 20 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 76 74 61    completion_vta
155a0 62 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72  b *pNew;.  int r
155b0 63 3b 0a 0a 20 20 28 76 6f 69 64 29 28 70 41 75  c;..  (void)(pAu
155c0 78 29 3b 20 20 20 20 2f 2a 20 55 6e 75 73 65 64  x);    /* Unused
155d0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
155e0 28 76 6f 69 64 29 28 61 72 67 63 29 3b 20 20 20  (void)(argc);   
155f0 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d   /* Unused param
15600 65 74 65 72 20 2a 2f 0a 20 20 28 76 6f 69 64 29  eter */.  (void)
15610 28 61 72 67 76 29 3b 20 20 20 20 2f 2a 20 55 6e  (argv);    /* Un
15620 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20 2a  used parameter *
15630 2f 0a 20 20 28 76 6f 69 64 29 28 70 7a 45 72 72  /.  (void)(pzErr
15640 29 3b 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 70  );   /* Unused p
15650 61 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 20  arameter */../* 
15660 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  Column numbers *
15670 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4d 50 4c 45  /.#define COMPLE
15680 54 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f 43 41 4e 44  TION_COLUMN_CAND
15690 49 44 41 54 45 20 30 20 20 2f 2a 20 53 75 67 67  IDATE 0  /* Sugg
156a0 65 73 74 65 64 20 63 6f 6d 70 6c 65 74 69 6f 6e  ested completion
156b0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 2a 2f   of the input */
156c0 0a 23 64 65 66 69 6e 65 20 43 4f 4d 50 4c 45 54  .#define COMPLET
156d0 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f 50 52 45 46 49  ION_COLUMN_PREFI
156e0 58 20 20 20 20 31 20 20 2f 2a 20 50 72 65 66 69  X    1  /* Prefi
156f0 78 20 6f 66 20 74 68 65 20 77 6f 72 64 20 74 6f  x of the word to
15700 20 62 65 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f   be completed */
15710 0a 23 64 65 66 69 6e 65 20 43 4f 4d 50 4c 45 54  .#define COMPLET
15720 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f 57 48 4f 4c 45  ION_COLUMN_WHOLE
15730 4c 49 4e 45 20 32 20 20 2f 2a 20 45 6e 74 69 72  LINE 2  /* Entir
15740 65 20 6c 69 6e 65 20 73 65 65 6e 20 73 6f 20 66  e line seen so f
15750 61 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f  ar */.#define CO
15760 4d 50 4c 45 54 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f  MPLETION_COLUMN_
15770 50 48 41 53 45 20 20 20 20 20 33 20 20 2f 2a 20  PHASE     3  /* 
15780 65 50 68 61 73 65 20 2d 20 75 73 65 64 20 66 6f  ePhase - used fo
15790 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
157a0 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   */..  rc = sqli
157b0 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
157c0 28 64 62 2c 0a 20 20 20 20 20 20 22 43 52 45 41  (db,.      "CREA
157d0 54 45 20 54 41 42 4c 45 20 78 28 22 0a 20 20 20  TE TABLE x(".   
157e0 20 20 20 22 20 20 63 61 6e 64 69 64 61 74 65 20     "  candidate 
157f0 54 45 58 54 2c 22 0a 20 20 20 20 20 20 22 20 20  TEXT,".      "  
15800 70 72 65 66 69 78 20 54 45 58 54 20 48 49 44 44  prefix TEXT HIDD
15810 45 4e 2c 22 0a 20 20 20 20 20 20 22 20 20 77 68  EN,".      "  wh
15820 6f 6c 65 6c 69 6e 65 20 54 45 58 54 20 48 49 44  oleline TEXT HID
15830 44 45 4e 2c 22 0a 20 20 20 20 20 20 22 20 20 70  DEN,".      "  p
15840 68 61 73 65 20 49 4e 54 20 48 49 44 44 45 4e 22  hase INT HIDDEN"
15850 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
15860 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
15870 6c 79 20 2a 2f 0a 20 20 20 20 20 20 22 29 22 29  ly */.      ")")
15880 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15890 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
158a0 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
158b0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
158c0 29 20 29 3b 0a 20 20 20 20 2a 70 70 56 74 61 62  ) );.    *ppVtab
158d0 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
158e0 2a 29 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20  *)pNew;.    if( 
158f0 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
15900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15910 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
15920 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
15930 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62 20  );.    pNew->db 
15940 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = db;.  }.  retu
15950 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15960 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 74  This method is t
15970 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
15980 72 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72  r completion_cur
15990 73 6f 72 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a  sor objects..*/.
159a0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 6c  static int compl
159b0 65 74 69 6f 6e 44 69 73 63 6f 6e 6e 65 63 74 28  etionDisconnect(
159c0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
159d0 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab){.  sqlite3_
159e0 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72  free(pVtab);.  r
159f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
15a10 75 63 74 6f 72 20 66 6f 72 20 61 20 6e 65 77 20  uctor for a new 
15a20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72 73 6f  completion_curso
15a30 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
15a40 74 69 63 20 69 6e 74 20 63 6f 6d 70 6c 65 74 69  tic int completi
15a50 6f 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  onOpen(sqlite3_v
15a60 74 61 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  tab *p, sqlite3_
15a70 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
15a80 43 75 72 73 6f 72 29 7b 0a 20 20 63 6f 6d 70 6c  Cursor){.  compl
15a90 65 74 69 6f 6e 5f 63 75 72 73 6f 72 20 2a 70 43  etion_cursor *pC
15aa0 75 72 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c  ur;.  pCur = sql
15ab0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
15ac0 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20  eof(*pCur) );.  
15ad0 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65  if( pCur==0 ) re
15ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15af0 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72  M;.  memset(pCur
15b00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75  , 0, sizeof(*pCu
15b10 72 29 29 3b 0a 20 20 70 43 75 72 2d 3e 64 62 20  r));.  pCur->db 
15b20 3d 20 28 28 63 6f 6d 70 6c 65 74 69 6f 6e 5f 76  = ((completion_v
15b30 74 61 62 2a 29 70 29 2d 3e 64 62 3b 0a 20 20 2a  tab*)p)->db;.  *
15b40 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72  ppCursor = &pCur
15b50 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e  ->base;.  return
15b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15b70 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 63  *.** Reset the c
15b80 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72 73 6f 72  ompletion_cursor
15b90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15ba0 20 63 6f 6d 70 6c 65 74 69 6f 6e 43 75 72 73 6f   completionCurso
15bb0 72 52 65 73 65 74 28 63 6f 6d 70 6c 65 74 69 6f  rReset(completio
15bc0 6e 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  n_cursor *pCur){
15bd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
15be0 70 43 75 72 2d 3e 7a 50 72 65 66 69 78 29 3b 20  pCur->zPrefix); 
15bf0 20 20 70 43 75 72 2d 3e 7a 50 72 65 66 69 78 20    pCur->zPrefix 
15c00 3d 20 30 3b 20 20 70 43 75 72 2d 3e 6e 50 72 65  = 0;  pCur->nPre
15c10 66 69 78 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  fix = 0;.  sqlit
15c20 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a 4c  e3_free(pCur->zL
15c30 69 6e 65 29 3b 20 20 20 20 20 70 43 75 72 2d 3e  ine);     pCur->
15c40 7a 4c 69 6e 65 20 3d 20 30 3b 20 20 20 20 70 43  zLine = 0;    pC
15c50 75 72 2d 3e 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20  ur->nLine = 0;. 
15c60 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
15c70 65 28 70 43 75 72 2d 3e 70 53 74 6d 74 29 3b 20  e(pCur->pStmt); 
15c80 70 43 75 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  pCur->pStmt = 0;
15c90 0a 20 20 70 43 75 72 2d 3e 6a 20 3d 20 30 3b 0a  .  pCur->j = 0;.
15ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63  }../*.** Destruc
15cb0 74 6f 72 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  tor for a comple
15cc0 74 69 6f 6e 5f 63 75 72 73 6f 72 2e 0a 2a 2f 0a  tion_cursor..*/.
15cd0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 6c  static int compl
15ce0 65 74 69 6f 6e 43 6c 6f 73 65 28 73 71 6c 69 74  etionClose(sqlit
15cf0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
15d00 63 75 72 29 7b 0a 20 20 63 6f 6d 70 6c 65 74 69  cur){.  completi
15d10 6f 6e 43 75 72 73 6f 72 52 65 73 65 74 28 28 63  onCursorReset((c
15d20 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72 73 6f 72  ompletion_cursor
15d30 2a 29 63 75 72 29 3b 0a 20 20 73 71 6c 69 74 65  *)cur);.  sqlite
15d40 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20 72  3_free(cur);.  r
15d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
15d70 65 20 61 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 63  e a completion_c
15d80 75 72 73 6f 72 20 74 6f 20 69 74 73 20 6e 65 78  ursor to its nex
15d90 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e  t row of output.
15da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 2d 3e 65 50 68  .**.** The ->ePh
15db0 61 73 65 2c 20 2d 3e 6a 2c 20 61 6e 64 20 2d 3e  ase, ->j, and ->
15dc0 70 53 74 6d 74 20 66 69 65 6c 64 73 20 6f 66 20  pStmt fields of 
15dd0 74 68 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 63  the completion_c
15de0 75 72 73 6f 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  ursor object.** 
15df0 72 65 63 6f 72 64 20 74 68 65 20 63 75 72 72 65  record the curre
15e00 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
15e10 73 63 61 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  scan.  This rout
15e20 69 6e 65 20 73 65 74 73 20 2d 3e 7a 43 75 72 72  ine sets ->zCurr
15e30 65 6e 74 52 6f 77 0a 2a 2a 20 74 6f 20 74 68 65  entRow.** to the
15e40 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
15e50 6f 75 74 70 75 74 20 61 6e 64 20 74 68 65 6e 20  output and then 
15e60 72 65 74 75 72 6e 73 2e 20 20 49 66 20 6e 6f 20  returns.  If no 
15e70 6d 6f 72 65 20 72 6f 77 73 20 72 65 6d 61 69 6e  more rows remain
15e80 2c 0a 2a 2a 20 74 68 65 6e 20 2d 3e 65 50 68 61  ,.** then ->ePha
15e90 73 65 20 69 73 20 73 65 74 20 74 6f 20 43 4f 4d  se is set to COM
15ea0 50 4c 45 54 49 4f 4e 5f 45 4f 46 20 77 68 69 63  PLETION_EOF whic
15eb0 68 20 77 69 6c 6c 20 73 69 67 6e 61 6c 20 74 68  h will signal th
15ec0 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  e virtual.** tab
15ed0 6c 65 20 74 68 61 74 20 68 61 73 20 72 65 61 63  le that has reac
15ee0 68 65 64 20 74 68 65 20 65 6e 64 20 6f 66 20 69  hed the end of i
15ef0 74 73 20 73 63 61 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ts scan..**.** T
15f00 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
15f10 6d 65 6e 74 61 74 69 6f 6e 20 6a 75 73 74 20 6c  mentation just l
15f20 69 73 74 73 20 70 6f 74 65 6e 74 69 61 6c 20 69  ists potential i
15f30 64 65 6e 74 69 66 69 65 72 73 20 61 6e 64 0a 2a  dentifiers and.*
15f40 2a 20 6b 65 79 77 6f 72 64 73 20 61 6e 64 20 66  * keywords and f
15f50 69 6c 74 65 72 73 20 74 68 65 6d 20 62 79 20 7a  ilters them by z
15f60 50 72 65 66 69 78 2e 20 20 46 75 74 75 72 65 20  Prefix.  Future 
15f70 65 6e 68 61 6e 63 65 6d 65 6e 74 73 20 73 68 6f  enhancements sho
15f80 75 6c 64 0a 2a 2a 20 74 61 6b 65 20 7a 4c 69 6e  uld.** take zLin
15f90 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 20 74  e into account t
15fa0 6f 20 74 72 79 20 74 6f 20 72 65 73 74 72 69 63  o try to restric
15fb0 74 20 74 68 65 20 73 65 74 20 6f 66 20 69 64 65  t the set of ide
15fc0 6e 74 69 66 69 65 72 73 20 61 6e 64 0a 2a 2a 20  ntifiers and.** 
15fd0 6b 65 79 77 6f 72 64 73 20 62 61 73 65 64 20 6f  keywords based o
15fe0 6e 20 77 68 61 74 20 77 6f 75 6c 64 20 62 65 20  n what would be 
15ff0 6c 65 67 61 6c 20 61 74 20 74 68 65 20 63 75 72  legal at the cur
16000 72 65 6e 74 20 70 6f 69 6e 74 20 6f 66 20 69 6e  rent point of in
16010 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  put..*/.static i
16020 6e 74 20 63 6f 6d 70 6c 65 74 69 6f 6e 4e 65 78  nt completionNex
16030 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
16040 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 63  ursor *cur){.  c
16050 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72 73 6f 72  ompletion_cursor
16060 20 2a 70 43 75 72 20 3d 20 28 63 6f 6d 70 6c 65   *pCur = (comple
16070 74 69 6f 6e 5f 63 75 72 73 6f 72 2a 29 63 75 72  tion_cursor*)cur
16080 3b 0a 20 20 69 6e 74 20 65 4e 65 78 74 50 68 61  ;.  int eNextPha
16090 73 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 65 78 74  se = 0;  /* Next
160a0 20 70 68 61 73 65 20 74 6f 20 74 72 79 20 69 66   phase to try if
160b0 20 63 75 72 72 65 6e 74 20 70 68 61 73 65 20 72   current phase r
160c0 65 61 63 68 65 73 20 65 6e 64 20 2a 2f 0a 20 20  eaches end */.  
160d0 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 20 20  int iCol = -1;  
160e0 20 20 20 20 20 2f 2a 20 49 66 20 3e 3d 30 2c 20       /* If >=0, 
160f0 73 74 65 70 20 70 43 75 72 2d 3e 70 53 74 6d 74  step pCur->pStmt
16100 20 61 6e 64 20 75 73 65 20 74 68 65 20 69 2d 74   and use the i-t
16110 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 43  h column */.  pC
16120 75 72 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20  ur->iRowid++;.  
16130 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 65 50 68  while( pCur->ePh
16140 61 73 65 21 3d 43 4f 4d 50 4c 45 54 49 4f 4e 5f  ase!=COMPLETION_
16150 45 4f 46 20 29 7b 0a 20 20 20 20 73 77 69 74 63  EOF ){.    switc
16160 68 28 20 70 43 75 72 2d 3e 65 50 68 61 73 65 20  h( pCur->ePhase 
16170 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 43 4f  ){.      case CO
16180 4d 50 4c 45 54 49 4f 4e 5f 4b 45 59 57 4f 52 44  MPLETION_KEYWORD
16190 53 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  S: {.        if(
161a0 20 70 43 75 72 2d 3e 6a 20 3e 3d 20 73 71 6c 69   pCur->j >= sqli
161b0 74 65 33 5f 6b 65 79 77 6f 72 64 5f 63 6f 75 6e  te3_keyword_coun
161c0 74 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  t() ){.         
161d0 20 70 43 75 72 2d 3e 7a 43 75 72 72 65 6e 74 52   pCur->zCurrentR
161e0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ow = 0;.        
161f0 20 20 70 43 75 72 2d 3e 65 50 68 61 73 65 20 3d    pCur->ePhase =
16200 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f 44 41 54 41   COMPLETION_DATA
16210 42 41 53 45 53 3b 0a 20 20 20 20 20 20 20 20 7d  BASES;.        }
16220 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16230 73 71 6c 69 74 65 33 5f 6b 65 79 77 6f 72 64 5f  sqlite3_keyword_
16240 6e 61 6d 65 28 70 43 75 72 2d 3e 6a 2b 2b 2c 20  name(pCur->j++, 
16250 26 70 43 75 72 2d 3e 7a 43 75 72 72 65 6e 74 52  &pCur->zCurrentR
16260 6f 77 2c 20 26 70 43 75 72 2d 3e 73 7a 52 6f 77  ow, &pCur->szRow
16270 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16280 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a       iCol = -1;.
16290 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
162a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
162b0 65 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f 44 41 54  e COMPLETION_DAT
162c0 41 42 41 53 45 53 3a 20 7b 0a 20 20 20 20 20 20  ABASES: {.      
162d0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 53 74 6d    if( pCur->pStm
162e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
162f0 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
16300 65 5f 76 32 28 70 43 75 72 2d 3e 64 62 2c 20 22  e_v2(pCur->db, "
16310 50 52 41 47 4d 41 20 64 61 74 61 62 61 73 65 5f  PRAGMA database_
16320 6c 69 73 74 22 2c 20 2d 31 2c 0a 20 20 20 20 20  list", -1,.     
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 70          &pCur->p
16350 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
16360 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c    }.        iCol
16370 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 65 4e   = 1;.        eN
16380 65 78 74 50 68 61 73 65 20 3d 20 43 4f 4d 50 4c  extPhase = COMPL
16390 45 54 49 4f 4e 5f 54 41 42 4c 45 53 3b 0a 20 20  ETION_TABLES;.  
163a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
163b0 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
163c0 43 4f 4d 50 4c 45 54 49 4f 4e 5f 54 41 42 4c 45  COMPLETION_TABLE
163d0 53 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  S: {.        if(
163e0 20 70 43 75 72 2d 3e 70 53 74 6d 74 3d 3d 30 20   pCur->pStmt==0 
163f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
16400 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 32 3b 0a  ite3_stmt *pS2;.
16410 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
16420 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  zSql = 0;.      
16430 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
16440 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20  zSep = "";.     
16450 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65       sqlite3_pre
16460 70 61 72 65 5f 76 32 28 70 43 75 72 2d 3e 64 62  pare_v2(pCur->db
16470 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61  , "PRAGMA databa
16480 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70  se_list", -1, &p
16490 53 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  S2, 0);.        
164a0 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
164b0 5f 73 74 65 70 28 70 53 32 29 3d 3d 53 51 4c 49  _step(pS2)==SQLI
164c0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
164d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
164e0 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63   *zDb = (const c
164f0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
16500 75 6d 6e 5f 74 65 78 74 28 70 53 32 2c 20 31 29  umn_text(pS2, 1)
16510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53  ;.            zS
16520 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
16530 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
16540 20 20 20 20 20 22 25 7a 25 73 22 0a 20 20 20 20       "%z%s".    
16550 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
16560 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 5c 22 25  CT name FROM \"%
16570 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  w\".sqlite_maste
16580 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r",.            
16590 20 20 20 7a 53 71 6c 2c 20 7a 53 65 70 2c 20 7a     zSql, zSep, z
165a0 44 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  Db.            )
165b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
165c0 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
165d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
165e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 65  .            zSe
165f0 70 20 3d 20 22 20 55 4e 49 4f 4e 20 22 3b 0a 20  p = " UNION ";. 
16600 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
16620 61 6c 69 7a 65 28 70 53 32 29 3b 0a 20 20 20 20  alize(pS2);.    
16630 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
16640 65 70 61 72 65 5f 76 32 28 70 43 75 72 2d 3e 64  epare_v2(pCur->d
16650 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
16660 75 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ur->pStmt, 0);. 
16670 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16680 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
16690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
166a0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
166b0 20 65 4e 65 78 74 50 68 61 73 65 20 3d 20 43 4f   eNextPhase = CO
166c0 4d 50 4c 45 54 49 4f 4e 5f 43 4f 4c 55 4d 4e 53  MPLETION_COLUMNS
166d0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
166e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
166f0 61 73 65 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f 43  ase COMPLETION_C
16700 4f 4c 55 4d 4e 53 3a 20 7b 0a 20 20 20 20 20 20  OLUMNS: {.      
16710 20 20 69 66 28 20 70 43 75 72 2d 3e 70 53 74 6d    if( pCur->pStm
16720 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
16730 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16740 70 53 32 3b 0a 20 20 20 20 20 20 20 20 20 20 63  pS2;.          c
16750 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20  har *zSql = 0;. 
16760 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
16770 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
16780 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16790 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 75  3_prepare_v2(pCu
167a0 72 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 64  r->db, "PRAGMA d
167b0 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 20 2d  atabase_list", -
167c0 31 2c 20 26 70 53 32 2c 20 30 29 3b 0a 20 20 20  1, &pS2, 0);.   
167d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71         while( sq
167e0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 32 29 3d  lite3_step(pS2)=
167f0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
16800 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
16810 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f   char *zDb = (co
16820 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
16830 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
16840 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  2, 1);.         
16850 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
16860 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
16870 20 20 20 20 20 20 20 20 20 20 22 25 7a 25 73 22            "%z%s"
16880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16890 22 53 45 4c 45 43 54 20 70 74 69 2e 6e 61 6d 65  "SELECT pti.name
168a0 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 73 71 6c   FROM \"%w\".sql
168b0 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73 6d  ite_master AS sm
168c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
168d0 20 20 20 20 20 20 20 20 20 22 20 4a 4f 49 4e 20           " JOIN 
168e0 70 72 61 67 6d 61 5f 74 61 62 6c 65 5f 69 6e 66  pragma_table_inf
168f0 6f 28 73 6d 2e 6e 61 6d 65 2c 25 51 29 20 41 53  o(sm.name,%Q) AS
16900 20 70 74 69 22 0a 20 20 20 20 20 20 20 20 20 20   pti".          
16910 20 20 20 20 20 22 20 57 48 45 52 45 20 73 6d 2e       " WHERE sm.
16920 74 79 70 65 3d 27 74 61 62 6c 65 27 22 2c 0a 20  type='table'",. 
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
16940 71 6c 2c 20 7a 53 65 70 2c 20 7a 44 62 2c 20 7a  ql, zSep, zDb, z
16950 44 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  Db.            )
16960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
16970 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
16980 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16990 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 65  .            zSe
169a0 70 20 3d 20 22 20 55 4e 49 4f 4e 20 22 3b 0a 20  p = " UNION ";. 
169b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
169c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
169d0 61 6c 69 7a 65 28 70 53 32 29 3b 0a 20 20 20 20  alize(pS2);.    
169e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
169f0 65 70 61 72 65 5f 76 32 28 70 43 75 72 2d 3e 64  epare_v2(pCur->d
16a00 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
16a10 75 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20  ur->pStmt, 0);. 
16a20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16a30 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
16a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
16a50 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
16a60 20 65 4e 65 78 74 50 68 61 73 65 20 3d 20 43 4f   eNextPhase = CO
16a70 4d 50 4c 45 54 49 4f 4e 5f 45 4f 46 3b 0a 20 20  MPLETION_EOF;.  
16a80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16a90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
16aa0 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
16ab0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
16ac0 69 73 20 77 68 65 6e 20 74 68 65 20 70 68 61 73  is when the phas
16ad0 65 20 70 72 65 73 65 74 73 20 7a 43 75 72 72 65  e presets zCurre
16ae0 6e 74 52 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  ntRow */.      i
16af0 66 28 20 70 43 75 72 2d 3e 7a 43 75 72 72 65 6e  f( pCur->zCurren
16b00 74 52 6f 77 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  tRow==0 ) contin
16b10 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ue;.    }else{. 
16b20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
16b30 5f 73 74 65 70 28 70 43 75 72 2d 3e 70 53 74 6d  _step(pCur->pStm
16b40 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
16b50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
16b60 72 61 63 74 20 74 68 65 20 6e 65 78 74 20 72 6f  ract the next ro
16b70 77 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  w of content */.
16b80 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 7a 43          pCur->zC
16b90 75 72 72 65 6e 74 52 6f 77 20 3d 20 28 63 6f 6e  urrentRow = (con
16ba0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
16bb0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 43 75  _column_text(pCu
16bc0 72 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b  r->pStmt, iCol);
16bd0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
16be0 7a 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63  zRow = sqlite3_c
16bf0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 43 75 72  olumn_bytes(pCur
16c00 2d 3e 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a  ->pStmt, iCol);.
16c10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16c20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c       /* When all
16c30 20 72 6f 77 73 20 61 72 65 20 66 69 6e 69 73 68   rows are finish
16c40 65 64 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  ed, advance to t
16c50 68 65 20 6e 65 78 74 20 70 68 61 73 65 20 2a 2f  he next phase */
16c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
16c70 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e  _finalize(pCur->
16c80 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
16c90 70 43 75 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  pCur->pStmt = 0;
16ca0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
16cb0 50 68 61 73 65 20 3d 20 65 4e 65 78 74 50 68 61  Phase = eNextPha
16cc0 73 65 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  se;.        cont
16cd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
16ce0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
16cf0 2d 3e 6e 50 72 65 66 69 78 3d 3d 30 20 29 20 62  ->nPrefix==0 ) b
16d00 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 43  reak;.    if( pC
16d10 75 72 2d 3e 6e 50 72 65 66 69 78 3c 3d 70 43 75  ur->nPrefix<=pCu
16d20 72 2d 3e 73 7a 52 6f 77 0a 20 20 20 20 20 26 26  r->szRow.     &&
16d30 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
16d40 70 28 70 43 75 72 2d 3e 7a 50 72 65 66 69 78 2c  p(pCur->zPrefix,
16d50 20 70 43 75 72 2d 3e 7a 43 75 72 72 65 6e 74 52   pCur->zCurrentR
16d60 6f 77 2c 20 70 43 75 72 2d 3e 6e 50 72 65 66 69  ow, pCur->nPrefi
16d70 78 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  x)==0.    ){.   
16d80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16d90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
16da0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16db0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * Return values 
16dc0 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 74  of columns for t
16dd0 68 65 20 72 6f 77 20 61 74 20 77 68 69 63 68 20  he row at which 
16de0 74 68 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 63  the completion_c
16df0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
16e00 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
16e10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
16e20 6d 70 6c 65 74 69 6f 6e 43 6f 6c 75 6d 6e 28 0a  mpletionColumn(.
16e30 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
16e40 75 72 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a  ursor *cur,   /*
16e50 20 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20   The cursor */. 
16e60 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
16e70 20 2a 63 74 78 2c 20 20 20 20 20 20 20 2f 2a 20   *ctx,       /* 
16e80 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
16e90 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  o sqlite3_result
16ea0 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  _...() */.  int 
16eb0 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i               
16ec0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
16ed0 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72   column to retur
16ee0 6e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6d 70 6c 65  n */.){.  comple
16ef0 74 69 6f 6e 5f 63 75 72 73 6f 72 20 2a 70 43 75  tion_cursor *pCu
16f00 72 20 3d 20 28 63 6f 6d 70 6c 65 74 69 6f 6e 5f  r = (completion_
16f10 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 73  cursor*)cur;.  s
16f20 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
16f30 63 61 73 65 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f  case COMPLETION_
16f40 43 4f 4c 55 4d 4e 5f 43 41 4e 44 49 44 41 54 45  COLUMN_CANDIDATE
16f50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
16f60 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
16f70 78 2c 20 70 43 75 72 2d 3e 7a 43 75 72 72 65 6e  x, pCur->zCurren
16f80 74 52 6f 77 2c 20 70 43 75 72 2d 3e 73 7a 52 6f  tRow, pCur->szRo
16f90 77 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  w,SQLITE_TRANSIE
16fa0 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
16fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
16fc0 20 43 4f 4d 50 4c 45 54 49 4f 4e 5f 43 4f 4c 55   COMPLETION_COLU
16fd0 4d 4e 5f 50 52 45 46 49 58 3a 20 7b 0a 20 20 20  MN_PREFIX: {.   
16fe0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
16ff0 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75 72  t_text(ctx, pCur
17000 2d 3e 7a 50 72 65 66 69 78 2c 20 2d 31 2c 20 53  ->zPrefix, -1, S
17010 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
17020 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17030 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 4f     }.    case CO
17040 4d 50 4c 45 54 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f  MPLETION_COLUMN_
17050 57 48 4f 4c 45 4c 49 4e 45 3a 20 7b 0a 20 20 20  WHOLELINE: {.   
17060 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
17070 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75 72  t_text(ctx, pCur
17080 2d 3e 7a 4c 69 6e 65 2c 20 2d 31 2c 20 53 51 4c  ->zLine, -1, SQL
17090 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
170a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
170b0 20 7d 0a 20 20 20 20 63 61 73 65 20 43 4f 4d 50   }.    case COMP
170c0 4c 45 54 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f 50 48  LETION_COLUMN_PH
170d0 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ASE: {.      sql
170e0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
170f0 63 74 78 2c 20 70 43 75 72 2d 3e 65 50 68 61 73  ctx, pCur->ePhas
17100 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
17110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17130 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17140 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
17150 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 20 49   current row.  I
17160 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  n this implement
17170 61 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 72 6f  ation, the.** ro
17180 77 69 64 20 69 73 20 74 68 65 20 73 61 6d 65 20  wid is the same 
17190 61 73 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  as the output va
171a0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
171b0 6e 74 20 63 6f 6d 70 6c 65 74 69 6f 6e 52 6f 77  nt completionRow
171c0 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
171d0 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c  cursor *cur, sql
171e0 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
171f0 64 29 7b 0a 20 20 63 6f 6d 70 6c 65 74 69 6f 6e  d){.  completion
17200 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
17210 28 63 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72 73  (completion_curs
17220 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77  or*)cur;.  *pRow
17230 69 64 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77 69  id = pCur->iRowi
17240 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
17250 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17260 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
17270 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 62 65  he cursor has be
17280 65 6e 20 6d 6f 76 65 64 20 6f 66 66 20 6f 66 20  en moved off of 
17290 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 77 20  the last.** row 
172a0 6f 66 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74  of output..*/.st
172b0 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 6c 65 74  atic int complet
172c0 69 6f 6e 45 6f 66 28 73 71 6c 69 74 65 33 5f 76  ionEof(sqlite3_v
172d0 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
172e0 7b 0a 20 20 63 6f 6d 70 6c 65 74 69 6f 6e 5f 63  {.  completion_c
172f0 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 63  ursor *pCur = (c
17300 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72 73 6f 72  ompletion_cursor
17310 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
17320 70 43 75 72 2d 3e 65 50 68 61 73 65 20 3e 3d 20  pCur->ePhase >= 
17330 43 4f 4d 50 4c 45 54 49 4f 4e 5f 45 4f 46 3b 0a  COMPLETION_EOF;.
17340 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  }../*.** This me
17350 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 74  thod is called t
17360 6f 20 22 72 65 77 69 6e 64 22 20 74 68 65 20 63  o "rewind" the c
17370 6f 6d 70 6c 65 74 69 6f 6e 5f 63 75 72 73 6f 72  ompletion_cursor
17380 20 6f 62 6a 65 63 74 20 62 61 63 6b 0a 2a 2a 20   object back.** 
17390 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
173a0 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 54 68 69   of output.  Thi
173b0 73 20 6d 65 74 68 6f 64 20 69 73 20 61 6c 77 61  s method is alwa
173c0 79 73 20 63 61 6c 6c 65 64 20 61 74 20 6c 65 61  ys called at lea
173d0 73 74 0a 2a 2a 20 6f 6e 63 65 20 70 72 69 6f 72  st.** once prior
173e0 20 74 6f 20 61 6e 79 20 63 61 6c 6c 20 74 6f 20   to any call to 
173f0 63 6f 6d 70 6c 65 74 69 6f 6e 43 6f 6c 75 6d 6e  completionColumn
17400 28 29 20 6f 72 20 63 6f 6d 70 6c 65 74 69 6f 6e  () or completion
17410 52 6f 77 69 64 28 29 20 6f 72 20 0a 2a 2a 20 63  Rowid() or .** c
17420 6f 6d 70 6c 65 74 69 6f 6e 45 6f 66 28 29 2e 0a  ompletionEof()..
17430 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
17440 6d 70 6c 65 74 69 6f 6e 46 69 6c 74 65 72 28 0a  mpletionFilter(.
17450 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
17460 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
17470 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  or, .  int idxNu
17480 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
17490 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
174a0 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
174b0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6d   **argv.){.  com
174c0 70 6c 65 74 69 6f 6e 5f 63 75 72 73 6f 72 20 2a  pletion_cursor *
174d0 70 43 75 72 20 3d 20 28 63 6f 6d 70 6c 65 74 69  pCur = (completi
174e0 6f 6e 5f 63 75 72 73 6f 72 20 2a 29 70 56 74 61  on_cursor *)pVta
174f0 62 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 69  bCursor;.  int i
17500 41 72 67 20 3d 20 30 3b 0a 20 20 28 76 6f 69 64  Arg = 0;.  (void
17510 29 28 69 64 78 53 74 72 29 3b 20 20 20 2f 2a 20  )(idxStr);   /* 
17520 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  Unused parameter
17530 20 2a 2f 0a 20 20 28 76 6f 69 64 29 28 61 72 67   */.  (void)(arg
17540 63 29 3b 20 20 20 20 20 2f 2a 20 55 6e 75 73 65  c);     /* Unuse
17550 64 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  d parameter */. 
17560 20 63 6f 6d 70 6c 65 74 69 6f 6e 43 75 72 73 6f   completionCurso
17570 72 52 65 73 65 74 28 70 43 75 72 29 3b 0a 20 20  rReset(pCur);.  
17580 69 66 28 20 69 64 78 4e 75 6d 20 26 20 31 20 29  if( idxNum & 1 )
17590 7b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 50 72 65  {.    pCur->nPre
175a0 66 69 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  fix = sqlite3_va
175b0 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69  lue_bytes(argv[i
175c0 41 72 67 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  Arg]);.    if( p
175d0 43 75 72 2d 3e 6e 50 72 65 66 69 78 3e 30 20 29  Cur->nPrefix>0 )
175e0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 7a 50  {.      pCur->zP
175f0 72 65 66 69 78 20 3d 20 73 71 6c 69 74 65 33 5f  refix = sqlite3_
17600 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
17610 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
17620 28 61 72 67 76 5b 69 41 72 67 5d 29 29 3b 0a 20  (argv[iArg]));. 
17630 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 7a       if( pCur->z
17640 50 72 65 66 69 78 3d 3d 30 20 29 20 72 65 74 75  Prefix==0 ) retu
17650 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
17660 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 72 67 20  .    }.    iArg 
17670 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 1;.  }.  if( i
17680 64 78 4e 75 6d 20 26 20 32 20 29 7b 0a 20 20 20  dxNum & 2 ){.   
17690 20 70 43 75 72 2d 3e 6e 4c 69 6e 65 20 3d 20 73   pCur->nLine = s
176a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
176b0 65 73 28 61 72 67 76 5b 69 41 72 67 5d 29 3b 0a  es(argv[iArg]);.
176c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 4c      if( pCur->nL
176d0 69 6e 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  ine>0 ){.      p
176e0 43 75 72 2d 3e 7a 4c 69 6e 65 20 3d 20 73 71 6c  Cur->zLine = sql
176f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
17700 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  ", sqlite3_value
17710 5f 74 65 78 74 28 61 72 67 76 5b 69 41 72 67 5d  _text(argv[iArg]
17720 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ));.      if( pC
17730 75 72 2d 3e 7a 4c 69 6e 65 3d 3d 30 20 29 20 72  ur->zLine==0 ) r
17740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17750 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
17760 69 66 28 20 70 43 75 72 2d 3e 7a 4c 69 6e 65 21  if( pCur->zLine!
17770 3d 30 20 26 26 20 70 43 75 72 2d 3e 7a 50 72 65  =0 && pCur->zPre
17780 66 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  fix==0 ){.    in
17790 74 20 69 20 3d 20 70 43 75 72 2d 3e 6e 4c 69 6e  t i = pCur->nLin
177a0 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  e;.    while( i>
177b0 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 70 43  0 && (isalnum(pC
177c0 75 72 2d 3e 7a 4c 69 6e 65 5b 69 2d 31 5d 29 20  ur->zLine[i-1]) 
177d0 7c 7c 20 70 43 75 72 2d 3e 7a 4c 69 6e 65 5b 69  || pCur->zLine[i
177e0 2d 31 5d 3d 3d 27 5f 27 29 20 29 7b 0a 20 20 20  -1]=='_') ){.   
177f0 20 20 20 69 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20     i--;.    }.  
17800 20 20 70 43 75 72 2d 3e 6e 50 72 65 66 69 78 20    pCur->nPrefix 
17810 3d 20 70 43 75 72 2d 3e 6e 4c 69 6e 65 20 2d 20  = pCur->nLine - 
17820 69 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  i;.    if( pCur-
17830 3e 6e 50 72 65 66 69 78 3e 30 20 29 7b 0a 20 20  >nPrefix>0 ){.  
17840 20 20 20 20 70 43 75 72 2d 3e 7a 50 72 65 66 69      pCur->zPrefi
17850 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  x = sqlite3_mpri
17860 6e 74 66 28 22 25 2e 2a 73 22 2c 20 70 43 75 72  ntf("%.*s", pCur
17870 2d 3e 6e 50 72 65 66 69 78 2c 20 70 43 75 72 2d  ->nPrefix, pCur-
17880 3e 7a 4c 69 6e 65 20 2b 20 69 29 3b 0a 20 20 20  >zLine + i);.   
17890 20 20 20 69 66 28 20 70 43 75 72 2d 3e 7a 50 72     if( pCur->zPr
178a0 65 66 69 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  efix==0 ) return
178b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
178c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
178d0 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 70  >iRowid = 0;.  p
178e0 43 75 72 2d 3e 65 50 68 61 73 65 20 3d 20 43 4f  Cur->ePhase = CO
178f0 4d 50 4c 45 54 49 4f 4e 5f 46 49 52 53 54 5f 50  MPLETION_FIRST_P
17900 48 41 53 45 3b 0a 20 20 72 65 74 75 72 6e 20 63  HASE;.  return c
17910 6f 6d 70 6c 65 74 69 6f 6e 4e 65 78 74 28 70 56  ompletionNext(pV
17920 74 61 62 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f  tabCursor);.}../
17930 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 77 69 6c 6c  *.** SQLite will
17940 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 6d 65 74   invoke this met
17950 68 6f 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hod one or more 
17960 74 69 6d 65 73 20 77 68 69 6c 65 20 70 6c 61 6e  times while plan
17970 6e 69 6e 67 20 61 20 71 75 65 72 79 0a 2a 2a 20  ning a query.** 
17980 74 68 61 74 20 75 73 65 73 20 74 68 65 20 63 6f  that uses the co
17990 6d 70 6c 65 74 69 6f 6e 20 76 69 72 74 75 61 6c  mpletion virtual
179a0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f   table.  This ro
179b0 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 63  utine needs to c
179c0 72 65 61 74 65 0a 2a 2a 20 61 20 71 75 65 72 79  reate.** a query
179d0 20 70 6c 61 6e 20 66 6f 72 20 65 61 63 68 20 69   plan for each i
179e0 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 63 6f  nvocation and co
179f0 6d 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61 74  mpute an estimat
17a00 65 64 20 63 6f 73 74 20 66 6f 72 20 74 68 61 74  ed cost for that
17a10 0a 2a 2a 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a 20  .** plan..**.** 
17a20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 68 69  There are two hi
17a30 64 64 65 6e 20 70 61 72 61 6d 65 74 65 72 73 20  dden parameters 
17a40 74 68 61 74 20 61 63 74 20 61 73 20 61 72 67 75  that act as argu
17a50 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  ments to the tab
17a60 6c 65 2d 76 61 6c 75 65 64 0a 2a 2a 20 66 75 6e  le-valued.** fun
17a70 63 74 69 6f 6e 3a 20 20 22 70 72 65 66 69 78 22  ction:  "prefix"
17a80 20 61 6e 64 20 22 77 68 6f 6c 65 6c 69 6e 65 22   and "wholeline"
17a90 2e 20 20 42 69 74 20 30 20 6f 66 20 69 64 78 4e  .  Bit 0 of idxN
17aa0 75 6d 20 69 73 20 73 65 74 20 69 66 20 22 70 72  um is set if "pr
17ab0 65 66 69 78 22 0a 2a 2a 20 69 73 20 61 76 61 69  efix".** is avai
17ac0 6c 61 62 6c 65 20 61 6e 64 20 62 69 74 20 31 20  lable and bit 1 
17ad0 69 73 20 73 65 74 20 69 66 20 22 77 68 6f 6c 65  is set if "whole
17ae0 6c 69 6e 65 22 20 69 73 20 61 76 61 69 6c 61 62  line" is availab
17af0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
17b00 74 20 63 6f 6d 70 6c 65 74 69 6f 6e 42 65 73 74  t completionBest
17b10 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33  Index(.  sqlite3
17b20 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71  _vtab *tab,.  sq
17b30 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
17b40 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20   *pIdxInfo.){.  
17b50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17b60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f         /* Loop o
17b70 76 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ver constraints 
17b80 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 20  */.  int idxNum 
17b90 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
17ba0 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 62 69  he query plan bi
17bb0 74 6d 61 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  tmask */.  int p
17bc0 72 65 66 69 78 49 64 78 20 3d 20 2d 31 3b 20 20  refixIdx = -1;  
17bd0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
17be0 65 20 73 74 61 72 74 3d 20 63 6f 6e 73 74 72 61  e start= constra
17bf0 69 6e 74 2c 20 6f 72 20 2d 31 20 69 66 20 6e 6f  int, or -1 if no
17c00 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 77 68 6f 6c  ne */.  int whol
17c10 65 6c 69 6e 65 49 64 78 20 3d 20 2d 31 3b 20 2f  elineIdx = -1; /
17c20 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 73  * Index of the s
17c30 74 6f 70 3d 20 63 6f 6e 73 74 72 61 69 6e 74 2c  top= constraint,
17c40 20 6f 72 20 2d 31 20 69 66 20 6e 6f 6e 65 20 2a   or -1 if none *
17c50 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30  /.  int nArg = 0
17c60 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
17c70 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
17c80 73 20 74 68 61 74 20 63 6f 6d 70 6c 65 74 65 46  s that completeF
17c90 69 6c 74 65 72 28 29 20 65 78 70 65 63 74 73 20  ilter() expects 
17ca0 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  */.  const struc
17cb0 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
17cc0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e  constraint *pCon
17cd0 73 74 72 61 69 6e 74 3b 0a 0a 20 20 28 76 6f 69  straint;..  (voi
17ce0 64 29 28 74 61 62 29 3b 20 20 20 20 2f 2a 20 55  d)(tab);    /* U
17cf0 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20  nused parameter 
17d00 2a 2f 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74  */.  pConstraint
17d10 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f   = pIdxInfo->aCo
17d20 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28  nstraint;.  for(
17d30 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
17d40 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
17d50 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b  +, pConstraint++
17d60 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  ){.    if( pCons
17d70 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d  traint->usable==
17d80 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
17d90 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
17da0 74 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e  t->op!=SQLITE_IN
17db0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
17dc0 51 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  Q ) continue;.  
17dd0 20 20 73 77 69 74 63 68 28 20 70 43 6f 6e 73 74    switch( pConst
17de0 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 29  raint->iColumn )
17df0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 43 4f 4d  {.      case COM
17e00 50 4c 45 54 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f 50  PLETION_COLUMN_P
17e10 52 45 46 49 58 3a 0a 20 20 20 20 20 20 20 20 70  REFIX:.        p
17e20 72 65 66 69 78 49 64 78 20 3d 20 69 3b 0a 20 20  refixIdx = i;.  
17e30 20 20 20 20 20 20 69 64 78 4e 75 6d 20 7c 3d 20        idxNum |= 
17e40 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
17e50 3b 0a 20 20 20 20 20 20 63 61 73 65 20 43 4f 4d  ;.      case COM
17e60 50 4c 45 54 49 4f 4e 5f 43 4f 4c 55 4d 4e 5f 57  PLETION_COLUMN_W
17e70 48 4f 4c 45 4c 49 4e 45 3a 0a 20 20 20 20 20 20  HOLELINE:.      
17e80 20 20 77 68 6f 6c 65 6c 69 6e 65 49 64 78 20 3d    wholelineIdx =
17e90 20 69 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e   i;.        idxN
17ea0 75 6d 20 7c 3d 20 32 3b 0a 20 20 20 20 20 20 20  um |= 2;.       
17eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17ec0 7d 0a 20 20 69 66 28 20 70 72 65 66 69 78 49 64  }.  if( prefixId
17ed0 78 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78  x>=0 ){.    pIdx
17ee0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
17ef0 74 55 73 61 67 65 5b 70 72 65 66 69 78 49 64 78  tUsage[prefixIdx
17f00 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 2b 2b  ].argvIndex = ++
17f10 6e 41 72 67 3b 0a 20 20 20 20 70 49 64 78 49 6e  nArg;.    pIdxIn
17f20 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
17f30 73 61 67 65 5b 70 72 65 66 69 78 49 64 78 5d 2e  sage[prefixIdx].
17f40 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  omit = 1;.  }.  
17f50 69 66 28 20 77 68 6f 6c 65 6c 69 6e 65 49 64 78  if( wholelineIdx
17f60 3e 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49  >=0 ){.    pIdxI
17f70 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
17f80 55 73 61 67 65 5b 77 68 6f 6c 65 6c 69 6e 65 49  Usage[wholelineI
17f90 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  dx].argvIndex = 
17fa0 2b 2b 6e 41 72 67 3b 0a 20 20 20 20 70 49 64 78  ++nArg;.    pIdx
17fb0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
17fc0 74 55 73 61 67 65 5b 77 68 6f 6c 65 6c 69 6e 65  tUsage[wholeline
17fd0 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  Idx].omit = 1;. 
17fe0 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69   }.  pIdxInfo->i
17ff0 64 78 4e 75 6d 20 3d 20 69 64 78 4e 75 6d 3b 0a  dxNum = idxNum;.
18000 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
18010 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75  matedCost = (dou
18020 62 6c 65 29 35 30 30 30 20 2d 20 31 30 30 30 2a  ble)5000 - 1000*
18030 6e 41 72 67 3b 0a 20 20 70 49 64 78 49 6e 66 6f  nArg;.  pIdxInfo
18040 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20  ->estimatedRows 
18050 3d 20 35 30 30 20 2d 20 31 30 30 2a 6e 41 72 67  = 500 - 100*nArg
18060 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18070 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
18080 68 69 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  his following st
18090 72 75 63 74 75 72 65 20 64 65 66 69 6e 65 73 20  ructure defines 
180a0 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
180b0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70  for the .** comp
180c0 6c 65 74 69 6f 6e 20 76 69 72 74 75 61 6c 20 74  letion virtual t
180d0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
180e0 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 63  sqlite3_module c
180f0 6f 6d 70 6c 65 74 69 6f 6e 4d 6f 64 75 6c 65 20  ompletionModule 
18100 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
18130 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18150 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 63 6f 6d  xCreate */.  com
18160 70 6c 65 74 69 6f 6e 43 6f 6e 6e 65 63 74 2c 20  pletionConnect, 
18170 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
18180 65 63 74 20 2a 2f 0a 20 20 63 6f 6d 70 6c 65 74  ect */.  complet
18190 69 6f 6e 42 65 73 74 49 6e 64 65 78 2c 20 20 20  ionBestIndex,   
181a0 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
181b0 78 20 2a 2f 0a 20 20 63 6f 6d 70 6c 65 74 69 6f  x */.  completio
181c0 6e 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20  nDisconnect,    
181d0 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
181e0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a   /* xDestroy */.
18210 20 20 63 6f 6d 70 6c 65 74 69 6f 6e 4f 70 65 6e    completionOpen
18220 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18230 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
18240 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6d 70 6c  ursor */.  compl
18250 65 74 69 6f 6e 43 6c 6f 73 65 2c 20 20 20 20 20  etionClose,     
18260 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
18270 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  - close a cursor
18280 20 2a 2f 0a 20 20 63 6f 6d 70 6c 65 74 69 6f 6e   */.  completion
18290 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
182a0 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
182b0 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
182c0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 63 6f  straints */.  co
182d0 6d 70 6c 65 74 69 6f 6e 4e 65 78 74 2c 20 20 20  mpletionNext,   
182e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
182f0 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
18300 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6d 70 6c 65  rsor */.  comple
18310 74 69 6f 6e 45 6f 66 2c 20 20 20 20 20 20 20 20  tionEof,        
18320 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
18330 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
18340 73 63 61 6e 20 2a 2f 0a 20 20 63 6f 6d 70 6c 65  scan */.  comple
18350 74 69 6f 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  tionColumn,     
18360 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
18370 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
18380 20 63 6f 6d 70 6c 65 74 69 6f 6e 52 6f 77 69 64   completionRowid
18390 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
183a0 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74  Rowid - read dat
183b0 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183d0 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
183e0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18400 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20  xBegin */.  0,  
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
18430 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18450 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
18460 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
18470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
18480 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20  ollback */.  0, 
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
184b0 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20  Method */.  0,  
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
184e0 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18500 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
18510 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20  /* xRelease */. 
18540 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
18550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
18560 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20 20  RollbackTo */.  
18570 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
18580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
18590 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a  hadowName */.};.
185a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
185b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
185c0 42 4c 45 20 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69  BLE */..int sqli
185d0 74 65 33 43 6f 6d 70 6c 65 74 69 6f 6e 56 74 61  te3CompletionVta
185e0 62 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  bInit(sqlite3 *d
185f0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
18600 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 6e 64 65  QLITE_OK;.#ifnde
18610 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
18620 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 72 63 20  RTUALTABLE.  rc 
18630 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
18640 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 63 6f 6d  _module(db, "com
18650 70 6c 65 74 69 6f 6e 22 2c 20 26 63 6f 6d 70 6c  pletion", &compl
18660 65 74 69 6f 6e 4d 6f 64 75 6c 65 2c 20 30 29 3b  etionModule, 0);
18670 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
18680 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f   rc;.}..#ifdef _
18690 57 49 4e 33 32 0a 0a 23 65 6e 64 69 66 0a 69 6e  WIN32..#endif.in
186a0 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  t sqlite3_comple
186b0 74 69 6f 6e 5f 69 6e 69 74 28 0a 20 20 73 71 6c  tion_init(.  sql
186c0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61  ite3 *db, .  cha
186d0 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20  r **pzErrMsg, . 
186e0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61   const sqlite3_a
186f0 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70  pi_routines *pAp
18700 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  i.){.  int rc = 
18710 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 53 51 4c  SQLITE_OK;.  SQL
18720 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
18730 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f  IT2(pApi);.  (vo
18740 69 64 29 28 70 7a 45 72 72 4d 73 67 29 3b 20 20  id)(pzErrMsg);  
18750 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65  /* Unused parame
18760 74 65 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ter */.#ifndef S
18770 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
18780 41 4c 54 41 42 4c 45 0a 20 20 72 63 20 3d 20 73  ALTABLE.  rc = s
18790 71 6c 69 74 65 33 43 6f 6d 70 6c 65 74 69 6f 6e  qlite3Completion
187a0 56 74 61 62 49 6e 69 74 28 64 62 29 3b 0a 23 65  VtabInit(db);.#e
187b0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
187c0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
187d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
187e0 45 6e 64 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  End ../ext/misc/
187f0 63 6f 6d 70 6c 65 74 69 6f 6e 2e 63 20 2a 2a 2a  completion.c ***
18800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18810 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
18820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
18830 67 69 6e 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  gin ../ext/misc/
18840 61 70 70 65 6e 64 76 66 73 2e 63 20 2a 2a 2a 2a  appendvfs.c ****
18850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
18860 2f 2a 0a 2a 2a 20 32 30 31 37 2d 31 30 2d 32 30  /*.** 2017-10-20
18870 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
18880 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
18890 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
188a0 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
188b0 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
188c0 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
188d0 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
188e0 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
188f0 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
18900 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
18910 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
18920 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
18930 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
18940 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
18950 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
18960 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
18970 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
18980 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
18990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189d0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
189e0 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
189f0 61 20 56 46 53 20 73 68 69 6d 20 74 68 61 74 20  a VFS shim that 
18a00 61 6c 6c 6f 77 73 20 61 6e 20 53 51 4c 69 74 65  allows an SQLite
18a10 20 64 61 74 61 62 61 73 65 20 74 6f 20 62 65 0a   database to be.
18a20 2a 2a 20 61 70 70 65 6e 64 65 64 20 6f 6e 74 6f  ** appended onto
18a30 20 74 68 65 20 65 6e 64 20 6f 66 20 73 6f 6d 65   the end of some
18a40 20 6f 74 68 65 72 20 66 69 6c 65 2c 20 73 75 63   other file, suc
18a50 68 20 61 73 20 61 6e 20 65 78 65 63 75 74 61 62  h as an executab
18a60 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 70 65 63  le..**.** A spec
18a70 69 61 6c 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ial record must 
18a80 61 70 70 65 61 72 20 61 74 20 74 68 65 20 65 6e  appear at the en
18a90 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  d of the file th
18aa0 61 74 20 69 64 65 6e 74 69 66 69 65 73 20 74 68  at identifies th
18ab0 65 0a 2a 2a 20 66 69 6c 65 20 61 73 20 61 6e 20  e.** file as an 
18ac0 61 70 70 65 6e 64 65 64 20 64 61 74 61 62 61 73  appended databas
18ad0 65 20 61 6e 64 20 70 72 6f 76 69 64 65 73 20 61  e and provides a
18ae0 6e 20 6f 66 66 73 65 74 20 74 6f 20 70 61 67 65  n offset to page
18af0 20 31 2e 20 20 46 6f 72 0a 2a 2a 20 62 65 73 74   1.  For.** best
18b00 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 70 61 67   performance pag
18b10 65 20 31 20 73 68 6f 75 6c 64 20 62 65 20 6c 6f  e 1 should be lo
18b20 63 61 74 65 64 20 61 74 20 61 20 64 69 73 6b 20  cated at a disk 
18b30 70 61 67 65 20 62 6f 75 6e 64 61 72 79 2c 20 74  page boundary, t
18b40 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 69 73  hough.** that is
18b50 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a   not required..*
18b60 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
18b70 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69  g a database usi
18b80 6e 67 20 74 68 69 73 20 56 46 53 2c 20 74 68 65  ng this VFS, the
18b90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68   connection migh
18ba0 74 20 74 72 65 61 74 0a 2a 2a 20 74 68 65 20 66  t treat.** the f
18bb0 69 6c 65 20 61 73 20 61 6e 20 6f 72 64 69 6e 61  ile as an ordina
18bc0 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
18bd0 73 65 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  se, or it might 
18be0 74 72 65 61 74 20 69 73 20 61 73 20 61 0a 2a 2a  treat is as a.**
18bf0 20 64 61 74 61 62 61 73 65 20 61 70 70 65 6e 64   database append
18c00 65 64 20 6f 6e 74 6f 20 73 6f 6d 65 20 6f 74 68  ed onto some oth
18c10 65 72 20 66 69 6c 65 2e 20 20 48 65 72 65 20 61  er file.  Here a
18c20 72 65 20 74 68 65 20 72 75 6c 65 73 3a 0a 2a 2a  re the rules:.**
18c30 0a 2a 2a 20 20 28 31 29 20 20 57 68 65 6e 20 6f  .**  (1)  When o
18c40 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 65 6d 70  pening a new emp
18c50 74 79 20 66 69 6c 65 2c 20 74 68 61 74 20 66 69  ty file, that fi
18c60 6c 65 20 69 73 20 74 72 65 61 74 65 64 20 61 73  le is treated as
18c70 20 61 6e 20 6f 72 64 69 6e 61 72 79 0a 2a 2a 20   an ordinary.** 
18c80 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 0a        database..
18c90 2a 2a 0a 2a 2a 20 20 28 32 29 20 20 57 68 65 6e  **.**  (2)  When
18ca0 20 6f 70 65 6e 69 6e 67 20 61 20 66 69 6c 65 20   opening a file 
18cb0 74 68 61 74 20 62 65 67 69 6e 73 20 77 69 74 68  that begins with
18cc0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 53 51   the standard SQ
18cd0 4c 69 74 65 20 70 72 65 66 69 78 0a 2a 2a 20 20  Lite prefix.**  
18ce0 20 20 20 20 20 73 74 72 69 6e 67 20 22 53 51 4c       string "SQL
18cf0 69 74 65 20 66 6f 72 6d 61 74 20 33 22 2c 20 74  ite format 3", t
18d00 68 61 74 20 66 69 6c 65 20 69 73 20 74 72 65 61  hat file is trea
18d10 74 65 64 20 61 73 20 61 6e 20 6f 72 64 69 6e 61  ted as an ordina
18d20 72 79 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  ry.**       data
18d30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 33 29  base..**.**  (3)
18d40 20 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61    When opening a
18d50 20 66 69 6c 65 20 74 68 61 74 20 65 6e 64 73 20   file that ends 
18d60 77 69 74 68 20 74 68 65 20 61 70 70 65 6e 64 76  with the appendv
18d70 66 73 20 74 72 61 69 6c 65 72 20 73 74 72 69 6e  fs trailer strin
18d80 67 0a 2a 2a 20 20 20 20 20 20 20 22 53 74 61 72  g.**       "Star
18d90 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 4e 4e 4e  t-Of-SQLite3-NNN
18da0 4e 4e 4e 4e 4e 22 20 74 68 61 74 20 66 69 6c 65  NNNNN" that file
18db0 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
18dc0 6e 20 61 70 70 65 6e 64 65 64 0a 2a 2a 20 20 20  n appended.**   
18dd0 20 20 20 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a      database..**
18de0 0a 2a 2a 20 20 28 34 29 20 20 49 66 20 6e 6f 6e  .**  (4)  If non
18df0 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  e of the above a
18e00 70 70 6c 79 20 61 6e 64 20 74 68 65 20 53 51 4c  pply and the SQL
18e10 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
18e20 66 6c 61 67 20 69 73 0a 2a 2a 20 20 20 20 20 20  flag is.**      
18e30 20 73 65 74 2c 20 74 68 65 6e 20 61 20 6e 65 77   set, then a new
18e40 20 64 61 74 61 62 61 73 65 20 69 73 20 61 70 70   database is app
18e50 65 6e 64 65 64 20 74 6f 20 74 68 65 20 61 6c 72  ended to the alr
18e60 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 66 69  eady existing fi
18e70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 35 29 20 20  le..**.**  (5)  
18e80 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
18e90 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
18ea0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f  turned..**.** To
18eb0 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
18ec0 72 79 20 63 6f 6d 70 6c 69 63 61 74 69 6f 6e 73  ry complications
18ed0 20 77 69 74 68 20 74 68 65 20 50 45 4e 44 49 4e   with the PENDIN
18ee0 47 5f 42 59 54 45 2c 20 74 68 65 20 73 69 7a 65  G_BYTE, the size
18ef0 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20   of.** the file 
18f00 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
18f10 61 74 61 62 61 73 65 20 69 73 20 6c 69 6d 69 74  atabase is limit
18f20 65 64 20 74 6f 20 31 47 42 2e 20 20 54 68 69 73  ed to 1GB.  This
18f30 20 56 46 53 20 77 69 6c 6c 20 72 65 66 75 73 65   VFS will refuse
18f40 0a 2a 2a 20 74 6f 20 72 65 61 64 20 6f 72 20 77  .** to read or w
18f50 72 69 74 65 20 70 61 73 74 20 74 68 65 20 31 47  rite past the 1G
18f60 42 20 6d 61 72 6b 2e 20 20 54 68 69 73 20 72 65  B mark.  This re
18f70 73 74 72 69 63 74 69 6f 6e 20 6d 69 67 68 74 20  striction might 
18f80 62 65 20 6c 69 66 74 65 64 20 69 6e 0a 2a 2a 20  be lifted in.** 
18f90 66 75 74 75 72 65 20 76 65 72 73 69 6f 6e 73 2e  future versions.
18fa0 20 20 46 6f 72 20 6e 6f 77 2c 20 69 66 20 79 6f    For now, if yo
18fb0 75 20 6e 65 65 64 20 61 20 6c 61 72 67 65 20 64  u need a large d
18fc0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6b 65  atabase, then ke
18fd0 65 70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ep the.** databa
18fe0 73 65 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  se in a separate
18ff0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
19000 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
19010 70 65 6e 65 64 20 69 73 20 6e 6f 74 20 61 6e 20  pened is not an 
19020 61 70 70 65 6e 64 65 64 20 64 61 74 61 62 61 73  appended databas
19030 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 68 69  e, then this shi
19040 6d 20 69 73 0a 2a 2a 20 61 20 70 61 73 73 2d 74  m is.** a pass-t
19050 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20  hrough into the 
19060 64 65 66 61 75 6c 74 20 75 6e 64 65 72 6c 79 69  default underlyi
19070 6e 67 20 56 46 53 2e 0a 2a 2a 2f 0a 53 51 4c 49  ng VFS..**/.SQLI
19080 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
19090 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  T1.#include <str
190a0 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
190b0 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 20 54  <assert.h>../* T
190c0 68 65 20 61 70 70 65 6e 64 20 6d 61 72 6b 20 61  he append mark a
190d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
190e0 20 64 61 74 61 62 61 73 65 20 69 73 3a 0a 2a 2a   database is:.**
190f0 0a 2a 2a 20 20 20 20 20 53 74 61 72 74 2d 4f 66  .**     Start-Of
19100 2d 53 51 4c 69 74 65 33 2d 4e 4e 4e 4e 4e 4e 4e  -SQLite3-NNNNNNN
19110 4e 0a 2a 2a 20 20 20 20 20 31 32 33 34 35 36 37  N.**     1234567
19120 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
19130 34 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4e 4e 4e  45.**.** The NNN
19140 4e 4e 4e 4e 4e 20 72 65 70 72 65 73 65 6e 74 73  NNNNN represents
19150 20 61 20 36 34 2d 62 69 74 20 62 69 67 2d 65 6e   a 64-bit big-en
19160 64 69 61 6e 20 75 6e 73 69 67 6e 65 64 20 69 6e  dian unsigned in
19170 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
19180 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  * the offset to 
19190 70 61 67 65 20 31 2e 0a 2a 2f 0a 23 64 65 66 69  page 1..*/.#defi
191a0 6e 65 20 41 50 4e 44 5f 4d 41 52 4b 5f 50 52 45  ne APND_MARK_PRE
191b0 46 49 58 20 20 20 20 20 22 53 74 61 72 74 2d 4f  FIX     "Start-O
191c0 66 2d 53 51 4c 69 74 65 33 2d 22 0a 23 64 65 66  f-SQLite3-".#def
191d0 69 6e 65 20 41 50 4e 44 5f 4d 41 52 4b 5f 50 52  ine APND_MARK_PR
191e0 45 46 49 58 5f 53 5a 20 20 31 37 0a 23 64 65 66  EFIX_SZ  17.#def
191f0 69 6e 65 20 41 50 4e 44 5f 4d 41 52 4b 5f 53 49  ine APND_MARK_SI
19200 5a 45 20 20 20 20 20 20 20 32 35 0a 0a 2f 2a 0a  ZE       25../*.
19210 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 69 7a 65 20  ** Maximum size 
19220 6f 66 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20  of the combined 
19230 70 72 65 66 69 78 20 2b 20 64 61 74 61 62 61 73  prefix + databas
19240 65 20 2b 20 61 70 70 65 6e 64 2d 6d 61 72 6b 2e  e + append-mark.
19250 20 20 54 68 69 73 0a 2a 2a 20 6d 75 73 74 20 62    This.** must b
19260 65 20 6c 65 73 73 20 74 68 61 6e 20 30 78 34 30  e less than 0x40
19270 30 30 30 30 30 30 20 74 6f 20 61 76 6f 69 64 20  000000 to avoid 
19280 6c 6f 63 6b 69 6e 67 20 69 73 73 75 65 73 20 6f  locking issues o
19290 6e 20 57 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 23 64  n Windows..*/.#d
192a0 65 66 69 6e 65 20 41 50 4e 44 5f 4d 41 58 5f 53  efine APND_MAX_S
192b0 49 5a 45 20 20 28 36 35 35 33 36 2a 31 35 32 35  IZE  (65536*1525
192c0 39 29 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  9)../*.** Forwar
192d0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66  d declaration of
192e0 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
192f0 20 74 68 69 73 20 75 74 69 6c 69 74 79 0a 2a 2f   this utility.*/
19300 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
19310 73 71 6c 69 74 65 33 5f 76 66 73 20 41 70 6e 64  sqlite3_vfs Apnd
19320 56 66 73 3b 0a 74 79 70 65 64 65 66 20 73 74 72  Vfs;.typedef str
19330 75 63 74 20 41 70 6e 64 46 69 6c 65 20 41 70 6e  uct ApndFile Apn
19340 64 46 69 6c 65 3b 0a 0a 2f 2a 20 41 63 63 65 73  dFile;../* Acces
19350 73 20 74 6f 20 61 20 6c 6f 77 65 72 2d 6c 65 76  s to a lower-lev
19360 65 6c 20 56 46 53 20 74 68 61 74 20 28 6d 69 67  el VFS that (mig
19370 68 74 29 20 69 6d 70 6c 65 6d 65 6e 74 20 64 79  ht) implement dy
19380 6e 61 6d 69 63 20 6c 6f 61 64 69 6e 67 2c 0a 2a  namic loading,.*
19390 2a 20 61 63 63 65 73 73 20 74 6f 20 72 61 6e 64  * access to rand
193a0 6f 6d 6e 65 73 73 2c 20 65 74 63 2e 0a 2a 2f 0a  omness, etc..*/.
193b0 23 64 65 66 69 6e 65 20 4f 52 49 47 56 46 53 28  #define ORIGVFS(
193c0 70 29 20 20 28 28 73 71 6c 69 74 65 33 5f 76 66  p)  ((sqlite3_vf
193d0 73 2a 29 28 28 70 29 2d 3e 70 41 70 70 44 61 74  s*)((p)->pAppDat
193e0 61 29 29 0a 23 64 65 66 69 6e 65 20 4f 52 49 47  a)).#define ORIG
193f0 46 49 4c 45 28 70 29 20 28 28 73 71 6c 69 74 65  FILE(p) ((sqlite
19400 33 5f 66 69 6c 65 2a 29 28 28 28 41 70 6e 64 46  3_file*)(((ApndF
19410 69 6c 65 2a 29 28 70 29 29 2b 31 29 29 0a 0a 2f  ile*)(p))+1))../
19420 2a 20 41 6e 20 6f 70 65 6e 20 66 69 6c 65 20 2a  * An open file *
19430 2f 0a 73 74 72 75 63 74 20 41 70 6e 64 46 69 6c  /.struct ApndFil
19440 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  e {.  sqlite3_fi
19450 6c 65 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  le base;        
19460 20 20 20 20 20 20 2f 2a 20 49 4f 20 6d 65 74 68        /* IO meth
19470 6f 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ods */.  sqlite3
19480 5f 69 6e 74 36 34 20 69 50 67 4f 6e 65 3b 20 20  _int64 iPgOne;  
19490 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
194a0 20 6f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20   offset to page 
194b0 31 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  1 */.  sqlite3_i
194c0 6e 74 36 34 20 69 4d 61 72 6b 3b 20 20 20 20 20  nt64 iMark;     
194d0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
194e0 6f 66 20 74 68 65 20 61 70 70 65 6e 64 2d 6d 61  of the append-ma
194f0 72 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  rk */.};../*.** 
19500 4d 65 74 68 6f 64 73 20 66 6f 72 20 41 70 6e 64  Methods for Apnd
19510 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  File.*/.static i
19520 6e 74 20 61 70 6e 64 43 6c 6f 73 65 28 73 71 6c  nt apndClose(sql
19530 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
19540 74 69 63 20 69 6e 74 20 61 70 6e 64 52 65 61 64  tic int apndRead
19550 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
19560 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c  void*, int iAmt,
19570 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
19580 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  Ofst);.static in
19590 74 20 61 70 6e 64 57 72 69 74 65 28 73 71 6c 69  t apndWrite(sqli
195a0 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 20  te3_file*,const 
195b0 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c 20  void*,int iAmt, 
195c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
195d0 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  fst);.static int
195e0 20 61 70 6e 64 54 72 75 6e 63 61 74 65 28 73 71   apndTruncate(sq
195f0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c  lite3_file*, sql
19600 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29  ite3_int64 size)
19610 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e  ;.static int apn
19620 64 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  dSync(sqlite3_fi
19630 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b  le*, int flags);
19640 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64  .static int apnd
19650 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
19660 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f  _file*, sqlite3_
19670 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a 73  int64 *pSize);.s
19680 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 4c 6f  tatic int apndLo
19690 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
196a0 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  , int);.static i
196b0 6e 74 20 61 70 6e 64 55 6e 6c 6f 63 6b 28 73 71  nt apndUnlock(sq
196c0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
196d0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  );.static int ap
196e0 6e 64 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ndCheckReservedL
196f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
19700 2a 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  *, int *pResOut)
19710 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e  ;.static int apn
19720 64 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  dFileControl(sql
19730 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20  ite3_file*, int 
19740 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b  op, void *pArg);
19750 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64  .static int apnd
19760 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
19770 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69  e3_file*);.stati
19780 63 20 69 6e 74 20 61 70 6e 64 44 65 76 69 63 65  c int apndDevice
19790 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
197a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
197b0 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53  static int apndS
197c0 68 6d 4d 61 70 28 73 71 6c 69 74 65 33 5f 66 69  hmMap(sqlite3_fi
197d0 6c 65 2a 2c 20 69 6e 74 20 69 50 67 2c 20 69 6e  le*, int iPg, in
197e0 74 20 70 67 73 7a 2c 20 69 6e 74 2c 20 76 6f 69  t pgsz, int, voi
197f0 64 20 76 6f 6c 61 74 69 6c 65 2a 2a 29 3b 0a 73  d volatile**);.s
19800 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53 68  tatic int apndSh
19810 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
19820 6c 65 2a 2c 20 69 6e 74 20 6f 66 66 73 65 74 2c  le*, int offset,
19830 20 69 6e 74 20 6e 2c 20 69 6e 74 20 66 6c 61 67   int n, int flag
19840 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
19850 61 70 6e 64 53 68 6d 42 61 72 72 69 65 72 28 73  apndShmBarrier(s
19860 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
19870 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53 68  tatic int apndSh
19880 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66  mUnmap(sqlite3_f
19890 69 6c 65 2a 2c 20 69 6e 74 20 64 65 6c 65 74 65  ile*, int delete
198a0 46 6c 61 67 29 3b 0a 73 74 61 74 69 63 20 69 6e  Flag);.static in
198b0 74 20 61 70 6e 64 46 65 74 63 68 28 73 71 6c 69  t apndFetch(sqli
198c0 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74  te3_file*, sqlit
198d0 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c 20  e3_int64 iOfst, 
198e0 69 6e 74 20 69 41 6d 74 2c 20 76 6f 69 64 20 2a  int iAmt, void *
198f0 2a 70 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  *pp);.static int
19900 20 61 70 6e 64 55 6e 66 65 74 63 68 28 73 71 6c   apndUnfetch(sql
19910 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69  ite3_file*, sqli
19920 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c  te3_int64 iOfst,
19930 20 76 6f 69 64 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a   void *p);../*.*
19940 2a 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 41 70  * Methods for Ap
19950 6e 64 56 66 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ndVfs.*/.static 
19960 69 6e 74 20 61 70 6e 64 4f 70 65 6e 28 73 71 6c  int apndOpen(sql
19970 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74  ite3_vfs*, const
19980 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33   char *, sqlite3
19990 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e  _file*, int , in
199a0 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t *);.static int
199b0 20 61 70 6e 64 44 65 6c 65 74 65 28 73 71 6c 69   apndDelete(sqli
199c0 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
199d0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
199e0 20 73 79 6e 63 44 69 72 29 3b 0a 73 74 61 74 69   syncDir);.stati
199f0 63 20 69 6e 74 20 61 70 6e 64 41 63 63 65 73 73  c int apndAccess
19a00 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63  (sqlite3_vfs*, c
19a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
19a20 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
19a30 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
19a40 61 70 6e 64 46 75 6c 6c 50 61 74 68 6e 61 6d 65  apndFullPathname
19a50 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63  (sqlite3_vfs*, c
19a60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
19a70 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75  , int, char *zOu
19a80 74 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  t);.static void 
19a90 2a 61 70 6e 64 44 6c 4f 70 65 6e 28 73 71 6c 69  *apndDlOpen(sqli
19aa0 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
19ab0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
19ac0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70  ;.static void ap
19ad0 6e 64 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ndDlError(sqlite
19ae0 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74  3_vfs*, int nByt
19af0 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
19b00 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  );.static void (
19b10 2a 61 70 6e 64 44 6c 53 79 6d 28 73 71 6c 69 74  *apndDlSym(sqlit
19b20 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
19b30 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
19b40 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 3b 0a  r*zSym))(void);.
19b50 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 6e 64  static void apnd
19b60 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
19b70 76 66 73 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73 74  vfs*, void*);.st
19b80 61 74 69 63 20 69 6e 74 20 61 70 6e 64 52 61 6e  atic int apndRan
19b90 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
19ba0 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c  vfs*, int nByte,
19bb0 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74   char *zOut);.st
19bc0 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53 6c 65  atic int apndSle
19bd0 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ep(sqlite3_vfs*,
19be0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
19bf0 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61  s);.static int a
19c00 70 6e 64 43 75 72 72 65 6e 74 54 69 6d 65 28 73  pndCurrentTime(s
19c10 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f 75  qlite3_vfs*, dou
19c20 62 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ble*);.static in
19c30 74 20 61 70 6e 64 47 65 74 4c 61 73 74 45 72 72  t apndGetLastErr
19c40 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  or(sqlite3_vfs*,
19c50 20 69 6e 74 2c 20 63 68 61 72 20 2a 29 3b 0a 73   int, char *);.s
19c60 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 43 75  tatic int apndCu
19c70 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
19c80 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 73 71 6c  qlite3_vfs*, sql
19c90 69 74 65 33 5f 69 6e 74 36 34 2a 29 3b 0a 73 74  ite3_int64*);.st
19ca0 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53 65 74  atic int apndSet
19cb0 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
19cc0 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63  e3_vfs*, const c
19cd0 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 73 79 73  har*,sqlite3_sys
19ce0 63 61 6c 6c 5f 70 74 72 29 3b 0a 73 74 61 74 69  call_ptr);.stati
19cf0 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
19d00 6c 5f 70 74 72 20 61 70 6e 64 47 65 74 53 79 73  l_ptr apndGetSys
19d10 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
19d20 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  vfs*, const char
19d30 20 2a 7a 29 3b 0a 73 74 61 74 69 63 20 63 6f 6e   *z);.static con
19d40 73 74 20 63 68 61 72 20 2a 61 70 6e 64 4e 65 78  st char *apndNex
19d50 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69  tSystemCall(sqli
19d60 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
19d70 63 68 61 72 20 2a 7a 4e 61 6d 65 29 3b 0a 0a 73  char *zName);..s
19d80 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
19d90 73 20 61 70 6e 64 5f 76 66 73 20 3d 20 7b 0a 20  s apnd_vfs = {. 
19da0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19dc0 2a 20 69 56 65 72 73 69 6f 6e 20 28 73 65 74 20  * iVersion (set 
19dd0 77 68 65 6e 20 72 65 67 69 73 74 65 72 65 64 29  when registered)
19de0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
19e10 28 73 65 74 20 77 68 65 6e 20 72 65 67 69 73 74  (set when regist
19e20 65 72 65 64 29 20 2a 2f 0a 20 20 31 30 32 34 2c  ered) */.  1024,
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
19e50 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20  thname */.  0,  
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
19e80 78 74 20 2a 2f 0a 20 20 22 61 70 6e 64 76 66 73  xt */.  "apndvfs
19e90 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
19ea0 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
19eb0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ed0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 28 73    /* pAppData (s
19ee0 65 74 20 77 68 65 6e 20 72 65 67 69 73 74 65 72  et when register
19ef0 65 64 29 20 2a 2f 20 0a 20 20 61 70 6e 64 4f 70  ed) */ .  apndOp
19f00 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
19f10 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
19f20 20 2a 2f 0a 20 20 61 70 6e 64 44 65 6c 65 74 65   */.  apndDelete
19f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19f40 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
19f50 2f 0a 20 20 61 70 6e 64 41 63 63 65 73 73 2c 20  /.  apndAccess, 
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
19f80 20 20 61 70 6e 64 46 75 6c 6c 50 61 74 68 6e 61    apndFullPathna
19f90 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
19fa0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
19fb0 20 2a 2f 0a 20 20 61 70 6e 64 44 6c 4f 70 65 6e   */.  apndDlOpen
19fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19fd0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
19fe0 2f 0a 20 20 61 70 6e 64 44 6c 45 72 72 6f 72 2c  /.  apndDlError,
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
1a010 0a 20 20 61 70 6e 64 44 6c 53 79 6d 2c 20 20 20  .  apndDlSym,   
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
1a040 61 70 6e 64 44 6c 43 6c 6f 73 65 2c 20 20 20 20  apndDlClose,    
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a060 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 61   xDlClose */.  a
1a070 70 6e 64 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  pndRandomness,  
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a090 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
1a0a0 20 61 70 6e 64 53 6c 65 65 70 2c 20 20 20 20 20   apndSleep,     
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a0c0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 61 70  * xSleep */.  ap
1a0d0 6e 64 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  ndCurrentTime,  
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a0f0 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
1a100 20 61 70 6e 64 47 65 74 4c 61 73 74 45 72 72 6f   apndGetLastErro
1a110 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
1a120 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
1a130 2a 2f 0a 20 20 61 70 6e 64 43 75 72 72 65 6e 74  */.  apndCurrent
1a140 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 20 20 20  TimeInt64,      
1a150 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
1a160 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 61 70 6e  meInt64 */.  apn
1a170 64 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  dSetSystemCall, 
1a180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1a190 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
1a1a0 20 20 61 70 6e 64 47 65 74 53 79 73 74 65 6d 43    apndGetSystemC
1a1b0 61 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  all,            
1a1c0 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
1a1d0 6c 20 2a 2f 0a 20 20 61 70 6e 64 4e 65 78 74 53  l */.  apndNextS
1a1e0 79 73 74 65 6d 43 61 6c 6c 20 20 20 20 20 20 20  ystemCall       
1a1f0 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73       /* xNextSys
1a200 74 65 6d 43 61 6c 6c 20 2a 2f 0a 7d 3b 0a 0a 73  temCall */.};..s
1a210 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1a220 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
1a230 70 6e 64 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d  pnd_io_methods =
1a240 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1a270 20 2a 2f 0a 20 20 61 70 6e 64 43 6c 6f 73 65 2c   */.  apndClose,
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1a2a0 2a 2f 0a 20 20 61 70 6e 64 52 65 61 64 2c 20 20  */.  apndRead,  
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
1a2d0 0a 20 20 61 70 6e 64 57 72 69 74 65 2c 20 20 20  .  apndWrite,   
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
1a300 20 20 61 70 6e 64 54 72 75 6e 63 61 74 65 2c 20    apndTruncate, 
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
1a330 2f 0a 20 20 61 70 6e 64 53 79 6e 63 2c 20 20 20  /.  apndSync,   
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
1a360 20 20 61 70 6e 64 46 69 6c 65 53 69 7a 65 2c 20    apndFileSize, 
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
1a390 2f 0a 20 20 61 70 6e 64 4c 6f 63 6b 2c 20 20 20  /.  apndLock,   
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
1a3c0 20 20 61 70 6e 64 55 6e 6c 6f 63 6b 2c 20 20 20    apndUnlock,   
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
1a3f0 20 20 61 70 6e 64 43 68 65 63 6b 52 65 73 65 72    apndCheckReser
1a400 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  vedLock,        
1a410 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1a420 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 61 70 6e  vedLock */.  apn
1a430 64 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  dFileControl,   
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a450 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
1a460 20 20 61 70 6e 64 53 65 63 74 6f 72 53 69 7a 65    apndSectorSize
1a470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a480 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
1a490 20 2a 2f 0a 20 20 61 70 6e 64 44 65 76 69 63 65   */.  apndDevice
1a4a0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
1a4b0 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
1a4c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1a4d0 2a 2f 0a 20 20 61 70 6e 64 53 68 6d 4d 61 70 2c  */.  apndShmMap,
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4f0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
1a500 2a 2f 0a 20 20 61 70 6e 64 53 68 6d 4c 6f 63 6b  */.  apndShmLock
1a510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a520 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
1a530 20 2a 2f 0a 20 20 61 70 6e 64 53 68 6d 42 61 72   */.  apndShmBar
1a540 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
1a550 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
1a560 72 69 65 72 20 2a 2f 0a 20 20 61 70 6e 64 53 68  rier */.  apndSh
1a570 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
1a580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1a590 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 61 70 6e 64  mUnmap */.  apnd
1a5a0 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a5c0 46 65 74 63 68 20 2a 2f 0a 20 20 61 70 6e 64 55  Fetch */.  apndU
1a5d0 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20  nfetch          
1a5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1a5f0 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 0a 0a  nfetch */.};....
1a600 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 61  /*.** Close an a
1a610 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  pnd-file..*/.sta
1a620 74 69 63 20 69 6e 74 20 61 70 6e 64 43 6c 6f 73  tic int apndClos
1a630 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1a640 70 46 69 6c 65 29 7b 0a 20 20 70 46 69 6c 65 20  pFile){.  pFile 
1a650 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65  = ORIGFILE(pFile
1a660 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c  );.  return pFil
1a670 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43 6c  e->pMethods->xCl
1a680 6f 73 65 28 70 46 69 6c 65 29 3b 0a 7d 0a 0a 2f  ose(pFile);.}../
1a690 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
1a6a0 72 6f 6d 20 61 6e 20 61 70 6e 64 2d 66 69 6c 65  rom an apnd-file
1a6b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a6c0 61 70 6e 64 52 65 61 64 28 0a 20 20 73 71 6c 69  apndRead(.  sqli
1a6d0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1a6e0 20 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20   .  void *zBuf, 
1a6f0 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20  .  int iAmt, .  
1a700 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66  sqlite_int64 iOf
1a710 73 74 0a 29 7b 0a 20 20 41 70 6e 64 46 69 6c 65  st.){.  ApndFile
1a720 20 2a 70 20 3d 20 28 41 70 6e 64 46 69 6c 65 20   *p = (ApndFile 
1a730 2a 29 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c 65  *)pFile;.  pFile
1a740 20 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c   = ORIGFILE(pFil
1a750 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  e);.  return pFi
1a760 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52  le->pMethods->xR
1a770 65 61 64 28 70 46 69 6c 65 2c 20 7a 42 75 66 2c  ead(pFile, zBuf,
1a780 20 69 41 6d 74 2c 20 69 4f 66 73 74 2b 70 2d 3e   iAmt, iOfst+p->
1a790 69 50 67 4f 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPgOne);.}../*.*
1a7a0 2a 20 41 64 64 20 74 68 65 20 61 70 70 65 6e 64  * Add the append
1a7b0 2d 6d 61 72 6b 20 6f 6e 74 6f 20 74 68 65 20 65  -mark onto the e
1a7c0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  nd of the file..
1a7d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
1a7e0 6e 64 57 72 69 74 65 4d 61 72 6b 28 41 70 6e 64  ndWriteMark(Apnd
1a7f0 46 69 6c 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  File *p, sqlite3
1a800 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1a810 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
1a820 65 64 20 63 68 61 72 20 61 5b 41 50 4e 44 5f 4d  ed char a[APND_M
1a830 41 52 4b 5f 53 49 5a 45 5d 3b 0a 20 20 6d 65 6d  ARK_SIZE];.  mem
1a840 63 70 79 28 61 2c 20 41 50 4e 44 5f 4d 41 52 4b  cpy(a, APND_MARK
1a850 5f 50 52 45 46 49 58 2c 20 41 50 4e 44 5f 4d 41  _PREFIX, APND_MA
1a860 52 4b 5f 50 52 45 46 49 58 5f 53 5a 29 3b 0a 20  RK_PREFIX_SZ);. 
1a870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 38 3b 20 69   for(i=0; i<8; i
1a880 2b 2b 29 7b 0a 20 20 20 20 61 5b 41 50 4e 44 5f  ++){.    a[APND_
1a890 4d 41 52 4b 5f 50 52 45 46 49 58 5f 53 5a 2b 69  MARK_PREFIX_SZ+i
1a8a0 5d 20 3d 20 28 70 2d 3e 69 50 67 4f 6e 65 20 3e  ] = (p->iPgOne >
1a8b0 3e 20 28 35 36 20 2d 20 69 2a 38 29 29 20 26 20  > (56 - i*8)) & 
1a8c0 30 78 66 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75  0xff;.  }.  retu
1a8d0 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  rn pFile->pMetho
1a8e0 64 73 2d 3e 78 57 72 69 74 65 28 70 46 69 6c 65  ds->xWrite(pFile
1a8f0 2c 20 61 2c 20 41 50 4e 44 5f 4d 41 52 4b 5f 53  , a, APND_MARK_S
1a900 49 5a 45 2c 20 70 2d 3e 69 4d 61 72 6b 29 3b 0a  IZE, p->iMark);.
1a910 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
1a920 61 74 61 20 74 6f 20 61 6e 20 61 70 6e 64 2d 66  ata to an apnd-f
1a930 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1a940 6e 74 20 61 70 6e 64 57 72 69 74 65 28 0a 20 20  nt apndWrite(.  
1a950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1a960 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ile,.  const voi
1a970 64 20 2a 7a 42 75 66 2c 0a 20 20 69 6e 74 20 69  d *zBuf,.  int i
1a980 41 6d 74 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e  Amt,.  sqlite_in
1a990 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 69  t64 iOfst.){.  i
1a9a0 6e 74 20 72 63 3b 0a 20 20 41 70 6e 64 46 69 6c  nt rc;.  ApndFil
1a9b0 65 20 2a 70 20 3d 20 28 41 70 6e 64 46 69 6c 65  e *p = (ApndFile
1a9c0 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c   *)pFile;.  pFil
1a9d0 65 20 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69  e = ORIGFILE(pFi
1a9e0 6c 65 29 3b 0a 20 20 69 66 28 20 69 4f 66 73 74  le);.  if( iOfst
1a9f0 2b 69 41 6d 74 3e 3d 41 50 4e 44 5f 4d 41 58 5f  +iAmt>=APND_MAX_
1aa00 53 49 5a 45 20 29 20 72 65 74 75 72 6e 20 53 51  SIZE ) return SQ
1aa10 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 72 63 20  LITE_FULL;.  rc 
1aa20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
1aa30 73 2d 3e 78 57 72 69 74 65 28 70 46 69 6c 65 2c  s->xWrite(pFile,
1aa40 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66   zBuf, iAmt, iOf
1aa50 73 74 2b 70 2d 3e 69 50 67 4f 6e 65 29 3b 0a 20  st+p->iPgOne);. 
1aa60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1aa70 4f 4b 20 26 26 20 20 69 4f 66 73 74 20 2b 20 69  OK &&  iOfst + i
1aa80 41 6d 74 20 2b 20 70 2d 3e 69 50 67 4f 6e 65 20  Amt + p->iPgOne 
1aa90 3e 20 70 2d 3e 69 4d 61 72 6b 20 29 7b 0a 20 20  > p->iMark ){.  
1aaa0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1aab0 73 7a 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  sz = 0;.    rc =
1aac0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
1aad0 2d 3e 78 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  ->xFileSize(pFil
1aae0 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
1aaf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ab00 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4d 61 72 6b  {.      p->iMark
1ab10 20 3d 20 73 7a 20 2d 20 41 50 4e 44 5f 4d 41 52   = sz - APND_MAR
1ab20 4b 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66  K_SIZE;.      if
1ab30 28 20 69 4f 66 73 74 20 2b 20 69 41 6d 74 20 2b  ( iOfst + iAmt +
1ab40 20 70 2d 3e 69 50 67 4f 6e 65 20 3e 20 70 2d 3e   p->iPgOne > p->
1ab50 69 4d 61 72 6b 20 29 7b 0a 20 20 20 20 20 20 20  iMark ){.       
1ab60 20 70 2d 3e 69 4d 61 72 6b 20 3d 20 70 2d 3e 69   p->iMark = p->i
1ab70 50 67 4f 6e 65 20 2b 20 69 4f 66 73 74 20 2b 20  PgOne + iOfst + 
1ab80 69 41 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63  iAmt;.        rc
1ab90 20 3d 20 61 70 6e 64 57 72 69 74 65 4d 61 72 6b   = apndWriteMark
1aba0 28 70 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20 20  (p, pFile);.    
1abb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1abc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1abd0 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20  .** Truncate an 
1abe0 61 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  apnd-file..*/.st
1abf0 61 74 69 63 20 69 6e 74 20 61 70 6e 64 54 72 75  atic int apndTru
1ac00 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
1ac10 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
1ac20 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20  e_int64 size){. 
1ac30 20 69 6e 74 20 72 63 3b 0a 20 20 41 70 6e 64 46   int rc;.  ApndF
1ac40 69 6c 65 20 2a 70 20 3d 20 28 41 70 6e 64 46 69  ile *p = (ApndFi
1ac50 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 46  le *)pFile;.  pF
1ac60 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45 28 70  ile = ORIGFILE(p
1ac70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 70 46  File);.  rc = pF
1ac80 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78  ile->pMethods->x
1ac90 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20  Truncate(pFile, 
1aca0 73 69 7a 65 2b 70 2d 3e 69 50 67 4f 6e 65 2b 41  size+p->iPgOne+A
1acb0 50 4e 44 5f 4d 41 52 4b 5f 53 49 5a 45 29 3b 0a  PND_MARK_SIZE);.
1acc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1acd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4d  _OK ){.    p->iM
1ace0 61 72 6b 20 3d 20 70 2d 3e 69 50 67 4f 6e 65 2b  ark = p->iPgOne+
1acf0 73 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 61  size;.    rc = a
1ad00 70 6e 64 57 72 69 74 65 4d 61 72 6b 28 70 2c 20  pndWriteMark(p, 
1ad10 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
1ad20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ad30 2a 20 53 79 6e 63 20 61 6e 20 61 70 6e 64 2d 66  * Sync an apnd-f
1ad40 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1ad50 6e 74 20 61 70 6e 64 53 79 6e 63 28 73 71 6c 69  nt apndSync(sqli
1ad60 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
1ad70 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 70   int flags){.  p
1ad80 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45 28  File = ORIGFILE(
1ad90 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e  pFile);.  return
1ada0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
1adb0 2d 3e 78 53 79 6e 63 28 70 46 69 6c 65 2c 20 66  ->xSync(pFile, f
1adc0 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lags);.}../*.** 
1add0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1ade0 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20  nt file-size of 
1adf0 61 6e 20 61 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f  an apnd-file..*/
1ae00 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64  .static int apnd
1ae10 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
1ae20 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  _file *pFile, sq
1ae30 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a  lite_int64 *pSiz
1ae40 65 29 7b 0a 20 20 41 70 6e 64 46 69 6c 65 20 2a  e){.  ApndFile *
1ae50 70 20 3d 20 28 41 70 6e 64 46 69 6c 65 20 2a 29  p = (ApndFile *)
1ae60 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pFile;.  int rc;
1ae70 0a 20 20 70 46 69 6c 65 20 3d 20 4f 52 49 47 46  .  pFile = ORIGF
1ae80 49 4c 45 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  ILE(p);.  rc = p
1ae90 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  File->pMethods->
1aea0 78 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2c  xFileSize(pFile,
1aeb0 20 70 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72   pSize);.  if( r
1aec0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1aed0 70 2d 3e 69 50 67 4f 6e 65 20 29 7b 0a 20 20 20  p->iPgOne ){.   
1aee0 20 2a 70 53 69 7a 65 20 2d 3d 20 70 2d 3e 69 50   *pSize -= p->iP
1aef0 67 4f 6e 65 20 2b 20 41 50 4e 44 5f 4d 41 52 4b  gOne + APND_MARK
1af00 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1af10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1af20 20 4c 6f 63 6b 20 61 6e 20 61 70 6e 64 2d 66 69   Lock an apnd-fi
1af30 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1af40 74 20 61 70 6e 64 4c 6f 63 6b 28 73 71 6c 69 74  t apndLock(sqlit
1af50 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1af60 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 70 46  int eLock){.  pF
1af70 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45 28 70  ile = ORIGFILE(p
1af80 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  File);.  return 
1af90 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d  pFile->pMethods-
1afa0 3e 78 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 65 4c  >xLock(pFile, eL
1afb0 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ock);.}../*.** U
1afc0 6e 6c 6f 63 6b 20 61 6e 20 61 70 6e 64 2d 66 69  nlock an apnd-fi
1afd0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1afe0 74 20 61 70 6e 64 55 6e 6c 6f 63 6b 28 73 71 6c  t apndUnlock(sql
1aff0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
1b000 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
1b010 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45  pFile = ORIGFILE
1b020 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72  (pFile);.  retur
1b030 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  n pFile->pMethod
1b040 73 2d 3e 78 55 6e 6c 6f 63 6b 28 70 46 69 6c 65  s->xUnlock(pFile
1b050 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
1b060 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f 74  ** Check if anot
1b070 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  her file-handle 
1b080 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
1b090 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 61 70 6e 64   lock on an apnd
1b0a0 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
1b0b0 20 69 6e 74 20 61 70 6e 64 43 68 65 63 6b 52 65   int apndCheckRe
1b0c0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
1b0d0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1b0e0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
1b0f0 20 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c   pFile = ORIGFIL
1b100 45 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75  E(pFile);.  retu
1b110 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  rn pFile->pMetho
1b120 64 73 2d 3e 78 43 68 65 63 6b 52 65 73 65 72 76  ds->xCheckReserv
1b130 65 64 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 52  edLock(pFile, pR
1b140 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  esOut);.}../*.**
1b150 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65   File control me
1b160 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d  thod. For custom
1b170 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61   operations on a
1b180 6e 20 61 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f 0a  n apnd-file..*/.
1b190 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 46  static int apndF
1b1a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1b1b0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1b1c0 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1b1d0 72 67 29 7b 0a 20 20 41 70 6e 64 46 69 6c 65 20  rg){.  ApndFile 
1b1e0 2a 70 20 3d 20 28 41 70 6e 64 46 69 6c 65 20 2a  *p = (ApndFile *
1b1f0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
1b200 3b 0a 20 20 70 46 69 6c 65 20 3d 20 4f 52 49 47  ;.  pFile = ORIG
1b210 46 49 4c 45 28 70 46 69 6c 65 29 3b 0a 20 20 72  FILE(pFile);.  r
1b220 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
1b230 6f 64 73 2d 3e 78 46 69 6c 65 43 6f 6e 74 72 6f  ods->xFileContro
1b240 6c 28 70 46 69 6c 65 2c 20 6f 70 2c 20 70 41 72  l(pFile, op, pAr
1b250 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  g);.  if( rc==SQ
1b260 4c 49 54 45 5f 4f 4b 20 26 26 20 6f 70 3d 3d 53  LITE_OK && op==S
1b270 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
1b280 41 4d 45 20 29 7b 0a 20 20 20 20 2a 28 63 68 61  AME ){.    *(cha
1b290 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
1b2a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 61 70 6e 64  e3_mprintf("apnd
1b2b0 28 25 6c 6c 64 29 2f 25 7a 22 2c 20 70 2d 3e 69  (%lld)/%z", p->i
1b2c0 50 67 4f 6e 65 2c 20 2a 28 63 68 61 72 2a 2a 29  PgOne, *(char**)
1b2d0 70 41 72 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pArg);.  }.  ret
1b2e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b2f0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1b300 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or-size in bytes
1b310 20 66 6f 72 20 61 6e 20 61 70 6e 64 2d 66 69 6c   for an apnd-fil
1b320 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b330 20 61 70 6e 64 53 65 63 74 6f 72 53 69 7a 65 28   apndSectorSize(
1b340 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1b350 69 6c 65 29 7b 0a 20 20 70 46 69 6c 65 20 3d 20  ile){.  pFile = 
1b360 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29 3b  ORIGFILE(pFile);
1b370 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
1b380 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 65 63 74  >pMethods->xSect
1b390 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 7d  orSize(pFile);.}
1b3a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b3b0 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
1b3c0 74 65 72 69 73 74 69 63 20 66 6c 61 67 73 20 73  teristic flags s
1b3d0 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e 20 61  upported by an a
1b3e0 70 6e 64 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  pnd-file..*/.sta
1b3f0 74 69 63 20 69 6e 74 20 61 70 6e 64 44 65 76 69  tic int apndDevi
1b400 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1b410 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1b420 70 46 69 6c 65 29 7b 0a 20 20 70 46 69 6c 65 20  pFile){.  pFile 
1b430 3d 20 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65  = ORIGFILE(pFile
1b440 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c  );.  return pFil
1b450 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44 65  e->pMethods->xDe
1b460 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1b470 69 63 73 28 70 46 69 6c 65 29 3b 0a 7d 0a 0a 2f  ics(pFile);.}../
1b480 2a 20 43 72 65 61 74 65 20 61 20 73 68 61 72 65  * Create a share
1b490 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 6d 61  d memory file ma
1b4a0 70 70 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  pping */.static 
1b4b0 69 6e 74 20 61 70 6e 64 53 68 6d 4d 61 70 28 0a  int apndShmMap(.
1b4c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1b4d0 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 69 50 67  pFile,.  int iPg
1b4e0 2c 0a 20 20 69 6e 74 20 70 67 73 7a 2c 0a 20 20  ,.  int pgsz,.  
1b4f0 69 6e 74 20 62 45 78 74 65 6e 64 2c 0a 20 20 76  int bExtend,.  v
1b500 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
1b510 70 0a 29 7b 0a 20 20 70 46 69 6c 65 20 3d 20 4f  p.){.  pFile = O
1b520 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29 3b 0a  RIGFILE(pFile);.
1b530 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
1b540 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4d 61  pMethods->xShmMa
1b550 70 28 70 46 69 6c 65 2c 69 50 67 2c 70 67 73 7a  p(pFile,iPg,pgsz
1b560 2c 62 45 78 74 65 6e 64 2c 70 70 29 3b 0a 7d 0a  ,bExtend,pp);.}.
1b570 0a 2f 2a 20 50 65 72 66 6f 72 6d 20 6c 6f 63 6b  ./* Perform lock
1b580 69 6e 67 20 6f 6e 20 61 20 73 68 61 72 65 64 2d  ing on a shared-
1b590 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
1b5a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e  /.static int apn
1b5b0 64 53 68 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33  dShmLock(sqlite3
1b5c0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
1b5d0 74 20 6f 66 66 73 65 74 2c 20 69 6e 74 20 6e 2c  t offset, int n,
1b5e0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 70   int flags){.  p
1b5f0 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45 28  File = ORIGFILE(
1b600 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e  pFile);.  return
1b610 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
1b620 2d 3e 78 53 68 6d 4c 6f 63 6b 28 70 46 69 6c 65  ->xShmLock(pFile
1b630 2c 6f 66 66 73 65 74 2c 6e 2c 66 6c 61 67 73 29  ,offset,n,flags)
1b640 3b 0a 7d 0a 0a 2f 2a 20 4d 65 6d 6f 72 79 20 62  ;.}../* Memory b
1b650 61 72 72 69 65 72 20 6f 70 65 72 61 74 69 6f 6e  arrier operation
1b660 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
1b670 79 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  y */.static void
1b680 20 61 70 6e 64 53 68 6d 42 61 72 72 69 65 72 28   apndShmBarrier(
1b690 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1b6a0 69 6c 65 29 7b 0a 20 20 70 46 69 6c 65 20 3d 20  ile){.  pFile = 
1b6b0 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29 3b  ORIGFILE(pFile);
1b6c0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
1b6d0 64 73 2d 3e 78 53 68 6d 42 61 72 72 69 65 72 28  ds->xShmBarrier(
1b6e0 70 46 69 6c 65 29 3b 0a 7d 0a 0a 2f 2a 20 55 6e  pFile);.}../* Un
1b6f0 6d 61 70 20 61 20 73 68 61 72 65 64 20 6d 65 6d  map a shared mem
1b700 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 73  ory segment */.s
1b710 74 61 74 69 63 20 69 6e 74 20 61 70 6e 64 53 68  tatic int apndSh
1b720 6d 55 6e 6d 61 70 28 73 71 6c 69 74 65 33 5f 66  mUnmap(sqlite3_f
1b730 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
1b740 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 70  deleteFlag){.  p
1b750 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c 45 28  File = ORIGFILE(
1b760 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e  pFile);.  return
1b770 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
1b780 2d 3e 78 53 68 6d 55 6e 6d 61 70 28 70 46 69 6c  ->xShmUnmap(pFil
1b790 65 2c 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 7d  e,deleteFlag);.}
1b7a0 0a 0a 2f 2a 20 46 65 74 63 68 20 61 20 70 61 67  ../* Fetch a pag
1b7b0 65 20 6f 66 20 61 20 6d 65 6d 6f 72 79 2d 6d 61  e of a memory-ma
1b7c0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 73 74 61  pped file */.sta
1b7d0 74 69 63 20 69 6e 74 20 61 70 6e 64 46 65 74 63  tic int apndFetc
1b7e0 68 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  h(.  sqlite3_fil
1b7f0 65 20 2a 70 46 69 6c 65 2c 0a 20 20 73 71 6c 69  e *pFile,.  sqli
1b800 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c  te3_int64 iOfst,
1b810 0a 20 20 69 6e 74 20 69 41 6d 74 2c 0a 20 20 76  .  int iAmt,.  v
1b820 6f 69 64 20 2a 2a 70 70 0a 29 7b 0a 20 20 41 70  oid **pp.){.  Ap
1b830 6e 64 46 69 6c 65 20 2a 70 20 3d 20 28 41 70 6e  ndFile *p = (Apn
1b840 64 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  dFile *)pFile;. 
1b850 20 70 46 69 6c 65 20 3d 20 4f 52 49 47 46 49 4c   pFile = ORIGFIL
1b860 45 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75  E(pFile);.  retu
1b870 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  rn pFile->pMetho
1b880 64 73 2d 3e 78 46 65 74 63 68 28 70 46 69 6c 65  ds->xFetch(pFile
1b890 2c 20 69 4f 66 73 74 2b 70 2d 3e 69 50 67 4f 6e  , iOfst+p->iPgOn
1b8a0 65 2c 20 69 41 6d 74 2c 20 70 70 29 3b 0a 7d 0a  e, iAmt, pp);.}.
1b8b0 0a 2f 2a 20 52 65 6c 65 61 73 65 20 61 20 6d 65  ./* Release a me
1b8c0 6d 6f 72 79 2d 6d 61 70 70 65 64 20 70 61 67 65  mory-mapped page
1b8d0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
1b8e0 70 6e 64 55 6e 66 65 74 63 68 28 73 71 6c 69 74  pndUnfetch(sqlit
1b8f0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1b900 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
1b910 66 73 74 2c 20 76 6f 69 64 20 2a 70 50 61 67 65  fst, void *pPage
1b920 29 7b 0a 20 20 41 70 6e 64 46 69 6c 65 20 2a 70  ){.  ApndFile *p
1b930 20 3d 20 28 41 70 6e 64 46 69 6c 65 20 2a 29 70   = (ApndFile *)p
1b940 46 69 6c 65 3b 0a 20 20 70 46 69 6c 65 20 3d 20  File;.  pFile = 
1b950 4f 52 49 47 46 49 4c 45 28 70 46 69 6c 65 29 3b  ORIGFILE(pFile);
1b960 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
1b970 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 55 6e 66 65  >pMethods->xUnfe
1b980 74 63 68 28 70 46 69 6c 65 2c 20 69 4f 66 73 74  tch(pFile, iOfst
1b990 2b 70 2d 3e 69 50 67 4f 6e 65 2c 20 70 50 61 67  +p->iPgOne, pPag
1b9a0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  e);.}../*.** Che
1b9b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1b9c0 20 66 69 6c 65 20 69 73 20 61 6e 20 6f 72 64 69   file is an ordi
1b9d0 6e 61 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  nary SQLite data
1b9e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
1b9f0 61 74 69 63 20 69 6e 74 20 61 70 6e 64 49 73 4f  atic int apndIsO
1ba00 72 64 69 6e 61 72 79 44 61 74 61 62 61 73 65 46  rdinaryDatabaseF
1ba10 69 6c 65 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ile(sqlite3_int6
1ba20 34 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 69  4 sz, sqlite3_fi
1ba30 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
1ba40 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 48 64  t rc;.  char zHd
1ba50 72 5b 31 36 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[16];.  static 
1ba60 63 6f 6e 73 74 20 63 68 61 72 20 61 53 71 6c 69  const char aSqli
1ba70 74 65 48 64 72 5b 5d 20 3d 20 22 53 51 4c 69 74  teHdr[] = "SQLit
1ba80 65 20 66 6f 72 6d 61 74 20 33 22 3b 0a 20 20 69  e format 3";.  i
1ba90 66 28 20 73 7a 3c 35 31 32 20 29 20 72 65 74 75  f( sz<512 ) retu
1baa0 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 46 69  rn 0;.  rc = pFi
1bab0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 52  le->pMethods->xR
1bac0 65 61 64 28 70 46 69 6c 65 2c 20 7a 48 64 72 2c  ead(pFile, zHdr,
1bad0 20 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 30   sizeof(zHdr), 0
1bae0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1baf0 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
1bb00 20 6d 65 6d 63 6d 70 28 7a 48 64 72 2c 20 61 53   memcmp(zHdr, aS
1bb10 71 6c 69 74 65 48 64 72 2c 20 73 69 7a 65 6f 66  qliteHdr, sizeof
1bb20 28 7a 48 64 72 29 29 3d 3d 30 3b 0a 7d 0a 0a 2f  (zHdr))==0;.}../
1bb30 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 72 65 61 64  *.** Try to read
1bb40 20 74 68 65 20 61 70 70 65 6e 64 2d 6d 61 72 6b   the append-mark
1bb50 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1bb60 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
1bb70 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f 66 20  the.** start of 
1bb80 74 68 65 20 61 70 70 65 6e 64 65 64 20 64 61 74  the appended dat
1bb90 61 62 61 73 65 20 69 66 20 74 68 65 20 61 70 70  abase if the app
1bba0 65 6e 64 2d 6d 61 72 6b 20 69 73 20 70 72 65 73  end-mark is pres
1bbb0 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 72  ent.  If.** ther
1bbc0 65 20 69 73 20 6e 6f 20 61 70 70 65 6e 64 2d 6d  e is no append-m
1bbd0 61 72 6b 2c 20 72 65 74 75 72 6e 20 2d 31 3b 0a  ark, return -1;.
1bbe0 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1bbf0 33 5f 69 6e 74 36 34 20 61 70 6e 64 52 65 61 64  3_int64 apndRead
1bc00 4d 61 72 6b 28 73 71 6c 69 74 65 33 5f 69 6e 74  Mark(sqlite3_int
1bc10 36 34 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66  64 sz, sqlite3_f
1bc20 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
1bc30 6e 74 20 72 63 2c 20 69 3b 0a 20 20 73 71 6c 69  nt rc, i;.  sqli
1bc40 74 65 33 5f 69 6e 74 36 34 20 69 4d 61 72 6b 3b  te3_int64 iMark;
1bc50 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1bc60 20 61 5b 41 50 4e 44 5f 4d 41 52 4b 5f 53 49 5a   a[APND_MARK_SIZ
1bc70 45 5d 3b 0a 0a 20 20 69 66 28 20 73 7a 3c 3d 41  E];..  if( sz<=A
1bc80 50 4e 44 5f 4d 41 52 4b 5f 53 49 5a 45 20 29 20  PND_MARK_SIZE ) 
1bc90 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 72 63 20  return -1;.  rc 
1bca0 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  = pFile->pMethod
1bcb0 73 2d 3e 78 52 65 61 64 28 70 46 69 6c 65 2c 20  s->xRead(pFile, 
1bcc0 61 2c 20 41 50 4e 44 5f 4d 41 52 4b 5f 53 49 5a  a, APND_MARK_SIZ
1bcd0 45 2c 20 73 7a 2d 41 50 4e 44 5f 4d 41 52 4b 5f  E, sz-APND_MARK_
1bce0 53 49 5a 45 29 3b 0a 20 20 69 66 28 20 72 63 20  SIZE);.  if( rc 
1bcf0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
1bd00 66 28 20 6d 65 6d 63 6d 70 28 61 2c 20 41 50 4e  f( memcmp(a, APN
1bd10 44 5f 4d 41 52 4b 5f 50 52 45 46 49 58 2c 20 41  D_MARK_PREFIX, A
1bd20 50 4e 44 5f 4d 41 52 4b 5f 50 52 45 46 49 58 5f  PND_MARK_PREFIX_
1bd30 53 5a 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  SZ)!=0 ) return 
1bd40 2d 31 3b 0a 20 20 69 4d 61 72 6b 20 3d 20 28 28  -1;.  iMark = ((
1bd50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 61  sqlite3_int64)(a
1bd60 5b 41 50 4e 44 5f 4d 41 52 4b 5f 50 52 45 46 49  [APND_MARK_PREFI
1bd70 58 5f 53 5a 5d 26 30 78 37 66 29 29 3c 3c 35 36  X_SZ]&0x7f))<<56
1bd80 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 38  ;.  for(i=1; i<8
1bd90 3b 20 69 2b 2b 29 7b 20 20 20 20 0a 20 20 20 20  ; i++){    .    
1bda0 69 4d 61 72 6b 20 2b 3d 20 28 73 71 6c 69 74 65  iMark += (sqlite
1bdb0 33 5f 69 6e 74 36 34 29 61 5b 41 50 4e 44 5f 4d  3_int64)a[APND_M
1bdc0 41 52 4b 5f 50 52 45 46 49 58 5f 53 5a 2b 69 5d  ARK_PREFIX_SZ+i]
1bdd0 3c 3c 28 35 36 2d 38 2a 69 29 3b 0a 20 20 7d 0a  <<(56-8*i);.  }.
1bde0 20 20 72 65 74 75 72 6e 20 69 4d 61 72 6b 3b 0a    return iMark;.
1bdf0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 6e  }../*.** Open an
1be00 20 61 70 6e 64 20 66 69 6c 65 20 68 61 6e 64 6c   apnd file handl
1be10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1be20 20 61 70 6e 64 4f 70 65 6e 28 0a 20 20 73 71 6c   apndOpen(.  sql
1be30 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
1be40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1be50 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66  ame,.  sqlite3_f
1be60 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e  ile *pFile,.  in
1be70 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a  t flags,.  int *
1be80 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 41  pOutFlags.){.  A
1be90 70 6e 64 46 69 6c 65 20 2a 70 3b 0a 20 20 73 71  pndFile *p;.  sq
1bea0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 53 75 62  lite3_file *pSub
1beb0 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  File;.  sqlite3_
1bec0 76 66 73 20 2a 70 53 75 62 56 66 73 3b 0a 20 20  vfs *pSubVfs;.  
1bed0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1bee0 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 70 53  3_int64 sz;.  pS
1bef0 75 62 56 66 73 20 3d 20 4f 52 49 47 56 46 53 28  ubVfs = ORIGVFS(
1bf00 70 56 66 73 29 3b 0a 20 20 69 66 28 20 28 66 6c  pVfs);.  if( (fl
1bf10 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1bf20 4e 5f 4d 41 49 4e 5f 44 42 29 3d 3d 30 20 29 7b  N_MAIN_DB)==0 ){
1bf30 0a 20 20 20 20 72 65 74 75 72 6e 20 70 53 75 62  .    return pSub
1bf40 56 66 73 2d 3e 78 4f 70 65 6e 28 70 53 75 62 56  Vfs->xOpen(pSubV
1bf50 66 73 2c 20 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  fs, zName, pFile
1bf60 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
1bf70 67 73 29 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28  gs);.  }.  p = (
1bf80 41 70 6e 64 46 69 6c 65 2a 29 70 46 69 6c 65 3b  ApndFile*)pFile;
1bf90 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1bfa0 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70  sizeof(*p));.  p
1bfb0 53 75 62 46 69 6c 65 20 3d 20 4f 52 49 47 46 49  SubFile = ORIGFI
1bfc0 4c 45 28 70 46 69 6c 65 29 3b 0a 20 20 70 2d 3e  LE(pFile);.  p->
1bfd0 62 61 73 65 2e 70 4d 65 74 68 6f 64 73 20 3d 20  base.pMethods = 
1bfe0 26 61 70 6e 64 5f 69 6f 5f 6d 65 74 68 6f 64 73  &apnd_io_methods
1bff0 3b 0a 20 20 72 63 20 3d 20 70 53 75 62 56 66 73  ;.  rc = pSubVfs
1c000 2d 3e 78 4f 70 65 6e 28 70 53 75 62 56 66 73 2c  ->xOpen(pSubVfs,
1c010 20 7a 4e 61 6d 65 2c 20 70 53 75 62 46 69 6c 65   zName, pSubFile
1c020 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
1c030 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  gs);.  if( rc ) 
1c040 67 6f 74 6f 20 61 70 6e 64 5f 6f 70 65 6e 5f 64  goto apnd_open_d
1c050 6f 6e 65 3b 0a 20 20 72 63 20 3d 20 70 53 75 62  one;.  rc = pSub
1c060 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  File->pMethods->
1c070 78 46 69 6c 65 53 69 7a 65 28 70 53 75 62 46 69  xFileSize(pSubFi
1c080 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 69 66 28 20  le, &sz);.  if( 
1c090 72 63 20 29 7b 0a 20 20 20 20 70 53 75 62 46 69  rc ){.    pSubFi
1c0a0 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 43  le->pMethods->xC
1c0b0 6c 6f 73 65 28 70 53 75 62 46 69 6c 65 29 3b 0a  lose(pSubFile);.
1c0c0 20 20 20 20 67 6f 74 6f 20 61 70 6e 64 5f 6f 70      goto apnd_op
1c0d0 65 6e 5f 64 6f 6e 65 3b 0a 20 20 7d 0a 20 20 69  en_done;.  }.  i
1c0e0 66 28 20 61 70 6e 64 49 73 4f 72 64 69 6e 61 72  f( apndIsOrdinar
1c0f0 79 44 61 74 61 62 61 73 65 46 69 6c 65 28 73 7a  yDatabaseFile(sz
1c100 2c 20 70 53 75 62 46 69 6c 65 29 20 29 7b 0a 20  , pSubFile) ){. 
1c110 20 20 20 6d 65 6d 6d 6f 76 65 28 70 46 69 6c 65     memmove(pFile
1c120 2c 20 70 53 75 62 46 69 6c 65 2c 20 70 53 75 62  , pSubFile, pSub
1c130 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
1c140 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c150 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  E_OK;.  }.  p->i
1c160 4d 61 72 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  Mark = 0;.  p->i
1c170 50 67 4f 6e 65 20 3d 20 61 70 6e 64 52 65 61 64  PgOne = apndRead
1c180 4d 61 72 6b 28 73 7a 2c 20 70 46 69 6c 65 29 3b  Mark(sz, pFile);
1c190 0a 20 20 69 66 28 20 70 2d 3e 69 50 67 4f 6e 65  .  if( p->iPgOne
1c1a0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1c1b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1c1c0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
1c1d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1c1e0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 53 75  E)==0 ){.    pSu
1c1f0 62 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 2d  bFile->pMethods-
1c200 3e 78 43 6c 6f 73 65 28 70 53 75 62 46 69 6c 65  >xClose(pSubFile
1c210 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1c220 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d  TE_CANTOPEN;.  }
1c230 0a 20 20 70 2d 3e 69 50 67 4f 6e 65 20 3d 20 28  .  p->iPgOne = (
1c240 73 7a 2b 30 78 66 66 66 29 20 26 20 7e 28 73 71  sz+0xfff) & ~(sq
1c250 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 66 66  lite3_int64)0xff
1c260 66 3b 0a 61 70 6e 64 5f 6f 70 65 6e 5f 64 6f 6e  f;.apnd_open_don
1c270 65 3a 0a 20 20 69 66 28 20 72 63 20 29 20 70 46  e:.  if( rc ) pF
1c280 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20  ile->pMethods = 
1c290 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1c2a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  }../*.** All oth
1c2b0 65 72 20 56 46 53 20 6d 65 74 68 6f 64 73 20 61  er VFS methods a
1c2c0 72 65 20 70 61 73 73 2d 74 68 72 75 73 2e 0a 2a  re pass-thrus..*
1c2d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 6e  /.static int apn
1c2e0 64 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  dDelete(sqlite3_
1c2f0 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
1c300 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
1c310 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 72 65  t dirSync){.  re
1c320 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66  turn ORIGVFS(pVf
1c330 73 29 2d 3e 78 44 65 6c 65 74 65 28 4f 52 49 47  s)->xDelete(ORIG
1c340 56 46 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68  VFS(pVfs), zPath
1c350 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 73 74  , dirSync);.}.st
1c360 61 74 69 63 20 69 6e 74 20 61 70 6e 64 41 63 63  atic int apndAcc
1c370 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
1c380 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
1c390 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
1c3a0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a 20  .  int flags, . 
1c3b0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b   int *pResOut.){
1c3c0 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46  .  return ORIGVF
1c3d0 53 28 70 56 66 73 29 2d 3e 78 41 63 63 65 73 73  S(pVfs)->xAccess
1c3e0 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c 20  (ORIGVFS(pVfs), 
1c3f0 7a 50 61 74 68 2c 20 66 6c 61 67 73 2c 20 70 52  zPath, flags, pR
1c400 65 73 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  esOut);.}.static
1c410 20 69 6e 74 20 61 70 6e 64 46 75 6c 6c 50 61 74   int apndFullPat
1c420 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
1c430 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63  _vfs *pVfs, .  c
1c440 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1c450 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a  , .  int nOut, .
1c460 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a    char *zOut.){.
1c470 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
1c480 28 70 56 66 73 29 2d 3e 78 46 75 6c 6c 50 61 74  (pVfs)->xFullPat
1c490 68 6e 61 6d 65 28 4f 52 49 47 56 46 53 28 70 56  hname(ORIGVFS(pV
1c4a0 66 73 29 2c 7a 50 61 74 68 2c 6e 4f 75 74 2c 7a  fs),zPath,nOut,z
1c4b0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
1c4c0 6f 69 64 20 2a 61 70 6e 64 44 6c 4f 70 65 6e 28  oid *apndDlOpen(
1c4d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1c4e0 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
1c4f0 50 61 74 68 29 7b 0a 20 20 72 65 74 75 72 6e 20  Path){.  return 
1c500 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78  ORIGVFS(pVfs)->x
1c510 44 6c 4f 70 65 6e 28 4f 52 49 47 56 46 53 28 70  DlOpen(ORIGVFS(p
1c520 56 66 73 29 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a  Vfs), zPath);.}.
1c530 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 6e 64  static void apnd
1c540 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
1c550 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
1c560 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72  Byte, char *zErr
1c570 4d 73 67 29 7b 0a 20 20 4f 52 49 47 56 46 53 28  Msg){.  ORIGVFS(
1c580 70 56 66 73 29 2d 3e 78 44 6c 45 72 72 6f 72 28  pVfs)->xDlError(
1c590 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 6e  ORIGVFS(pVfs), n
1c5a0 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  Byte, zErrMsg);.
1c5b0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
1c5c0 61 70 6e 64 44 6c 53 79 6d 28 73 71 6c 69 74 65  apndDlSym(sqlite
1c5d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
1c5e0 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
1c5f0 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a   *zSym))(void){.
1c600 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46 53    return ORIGVFS
1c610 28 70 56 66 73 29 2d 3e 78 44 6c 53 79 6d 28 4f  (pVfs)->xDlSym(O
1c620 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 70 2c  RIGVFS(pVfs), p,
1c630 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63   zSym);.}.static
1c640 20 76 6f 69 64 20 61 70 6e 64 44 6c 43 6c 6f 73   void apndDlClos
1c650 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
1c660 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
1c670 6c 65 29 7b 0a 20 20 4f 52 49 47 56 46 53 28 70  le){.  ORIGVFS(p
1c680 56 66 73 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 4f  Vfs)->xDlClose(O
1c690 52 49 47 56 46 53 28 70 56 66 73 29 2c 20 70 48  RIGVFS(pVfs), pH
1c6a0 61 6e 64 6c 65 29 3b 0a 7d 0a 73 74 61 74 69 63  andle);.}.static
1c6b0 20 69 6e 74 20 61 70 6e 64 52 61 6e 64 6f 6d 6e   int apndRandomn
1c6c0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
1c6d0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65  *pVfs, int nByte
1c6e0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
1c6f0 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56  {.  return ORIGV
1c700 46 53 28 70 56 66 73 29 2d 3e 78 52 61 6e 64 6f  FS(pVfs)->xRando
1c710 6d 6e 65 73 73 28 4f 52 49 47 56 46 53 28 70 56  mness(ORIGVFS(pV
1c720 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66  fs), nByte, zBuf
1c730 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Out);.}.static i
1c740 6e 74 20 61 70 6e 64 53 6c 65 65 70 28 73 71 6c  nt apndSleep(sql
1c750 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1c760 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 72  int nMicro){.  r
1c770 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56  eturn ORIGVFS(pV
1c780 66 73 29 2d 3e 78 53 6c 65 65 70 28 4f 52 49 47  fs)->xSleep(ORIG
1c790 56 46 53 28 70 56 66 73 29 2c 20 6e 4d 69 63 72  VFS(pVfs), nMicr
1c7a0 6f 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  o);.}.static int
1c7b0 20 61 70 6e 64 43 75 72 72 65 6e 74 54 69 6d 65   apndCurrentTime
1c7c0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
1c7d0 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69 6d  fs, double *pTim
1c7e0 65 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  eOut){.  return 
1c7f0 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78  ORIGVFS(pVfs)->x
1c800 43 75 72 72 65 6e 74 54 69 6d 65 28 4f 52 49 47  CurrentTime(ORIG
1c810 56 46 53 28 70 56 66 73 29 2c 20 70 54 69 6d 65  VFS(pVfs), pTime
1c820 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Out);.}.static i
1c830 6e 74 20 61 70 6e 64 47 65 74 4c 61 73 74 45 72  nt apndGetLastEr
1c840 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
1c850 2a 70 56 66 73 2c 20 69 6e 74 20 61 2c 20 63 68  *pVfs, int a, ch
1c860 61 72 20 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e  ar *b){.  return
1c870 20 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e   ORIGVFS(pVfs)->
1c880 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 4f 52  xGetLastError(OR
1c890 49 47 56 46 53 28 70 56 66 73 29 2c 20 61 2c 20  IGVFS(pVfs), a, 
1c8a0 62 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  b);.}.static int
1c8b0 20 61 70 6e 64 43 75 72 72 65 6e 74 54 69 6d 65   apndCurrentTime
1c8c0 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
1c8d0 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
1c8e0 5f 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 72 65  _int64 *p){.  re
1c8f0 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66  turn ORIGVFS(pVf
1c900 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  s)->xCurrentTime
1c910 49 6e 74 36 34 28 4f 52 49 47 56 46 53 28 70 56  Int64(ORIGVFS(pV
1c920 66 73 29 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69  fs), p);.}.stati
1c930 63 20 69 6e 74 20 61 70 6e 64 53 65 74 53 79 73  c int apndSetSys
1c940 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
1c950 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20  e3_vfs *pVfs,.  
1c960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1c970 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  e,.  sqlite3_sys
1c980 63 61 6c 6c 5f 70 74 72 20 70 43 61 6c 6c 0a 29  call_ptr pCall.)
1c990 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56  {.  return ORIGV
1c9a0 46 53 28 70 56 66 73 29 2d 3e 78 53 65 74 53 79  FS(pVfs)->xSetSy
1c9b0 73 74 65 6d 43 61 6c 6c 28 4f 52 49 47 56 46 53  stemCall(ORIGVFS
1c9c0 28 70 56 66 73 29 2c 7a 4e 61 6d 65 2c 70 43 61  (pVfs),zName,pCa
1c9d0 6c 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 73 71  ll);.}.static sq
1c9e0 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
1c9f0 72 20 61 70 6e 64 47 65 74 53 79 73 74 65 6d 43  r apndGetSystemC
1ca00 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
1ca10 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
1ca20 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
1ca30 0a 20 20 72 65 74 75 72 6e 20 4f 52 49 47 56 46  .  return ORIGVF
1ca40 53 28 70 56 66 73 29 2d 3e 78 47 65 74 53 79 73  S(pVfs)->xGetSys
1ca50 74 65 6d 43 61 6c 6c 28 4f 52 49 47 56 46 53 28  temCall(ORIGVFS(
1ca60 70 56 66 73 29 2c 7a 4e 61 6d 65 29 3b 0a 7d 0a  pVfs),zName);.}.
1ca70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1ca80 72 20 2a 61 70 6e 64 4e 65 78 74 53 79 73 74 65  r *apndNextSyste
1ca90 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
1caa0 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
1cab0 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 72  har *zName){.  r
1cac0 65 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56  eturn ORIGVFS(pV
1cad0 66 73 29 2d 3e 78 4e 65 78 74 53 79 73 74 65 6d  fs)->xNextSystem
1cae0 43 61 6c 6c 28 4f 52 49 47 56 46 53 28 70 56 66  Call(ORIGVFS(pVf
1caf0 73 29 2c 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 20  s), zName);.}.. 
1cb00 20 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a   .#ifdef _WIN32.
1cb10 0a 23 65 6e 64 69 66 0a 2f 2a 20 0a 2a 2a 20 54  .#endif./* .** T
1cb20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1cb30 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 65  alled when the e
1cb40 78 74 65 6e 73 69 6f 6e 20 69 73 20 6c 6f 61 64  xtension is load
1cb50 65 64 2e 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ed..** Register 
1cb60 74 68 65 20 6e 65 77 20 56 46 53 2e 0a 2a 2f 0a  the new VFS..*/.
1cb70 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 70 70 65  int sqlite3_appe
1cb80 6e 64 76 66 73 5f 69 6e 69 74 28 0a 20 20 73 71  ndvfs_init(.  sq
1cb90 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68  lite3 *db, .  ch
1cba0 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a  ar **pzErrMsg, .
1cbb0 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
1cbc0 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
1cbd0 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pi.){.  int rc =
1cbe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1cbf0 6c 69 74 65 33 5f 76 66 73 20 2a 70 4f 72 69 67  lite3_vfs *pOrig
1cc00 3b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  ;.  SQLITE_EXTEN
1cc10 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
1cc20 3b 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d  ;.  (void)pzErrM
1cc30 73 67 3b 0a 20 20 28 76 6f 69 64 29 64 62 3b 0a  sg;.  (void)db;.
1cc40 20 20 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65    pOrig = sqlite
1cc50 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
1cc60 20 61 70 6e 64 5f 76 66 73 2e 69 56 65 72 73 69   apnd_vfs.iVersi
1cc70 6f 6e 20 3d 20 70 4f 72 69 67 2d 3e 69 56 65 72  on = pOrig->iVer
1cc80 73 69 6f 6e 3b 0a 20 20 61 70 6e 64 5f 76 66 73  sion;.  apnd_vfs
1cc90 2e 70 41 70 70 44 61 74 61 20 3d 20 70 4f 72 69  .pAppData = pOri
1cca0 67 3b 0a 20 20 61 70 6e 64 5f 76 66 73 2e 73 7a  g;.  apnd_vfs.sz
1ccb0 4f 73 46 69 6c 65 20 3d 20 70 4f 72 69 67 2d 3e  OsFile = pOrig->
1ccc0 73 7a 4f 73 46 69 6c 65 20 2b 20 73 69 7a 65 6f  szOsFile + sizeo
1ccd0 66 28 41 70 6e 64 46 69 6c 65 29 3b 0a 20 20 72  f(ApndFile);.  r
1cce0 63 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  c = sqlite3_vfs_
1ccf0 72 65 67 69 73 74 65 72 28 26 61 70 6e 64 5f 76  register(&apnd_v
1cd00 66 73 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 41  fs, 0);.#ifdef A
1cd10 50 50 45 4e 44 56 46 53 5f 54 45 53 54 0a 20 20  PPENDVFS_TEST.  
1cd20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cd30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1cd40 6c 69 74 65 33 5f 61 75 74 6f 5f 65 78 74 65 6e  lite3_auto_exten
1cd50 73 69 6f 6e 28 28 76 6f 69 64 28 2a 29 28 76 6f  sion((void(*)(vo
1cd60 69 64 29 29 61 70 6e 64 76 66 73 52 65 67 69 73  id))apndvfsRegis
1cd70 74 65 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ter);.  }.#endif
1cd80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cd90 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
1cda0 54 45 5f 4f 4b 5f 4c 4f 41 44 5f 50 45 52 4d 41  TE_OK_LOAD_PERMA
1cdb0 4e 45 4e 54 4c 59 3b 0a 20 20 72 65 74 75 72 6e  NENTLY;.  return
1cdc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
1cdd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cde0 2a 2a 20 45 6e 64 20 2e 2e 2f 65 78 74 2f 6d 69  ** End ../ext/mi
1cdf0 73 63 2f 61 70 70 65 6e 64 76 66 73 2e 63 20 2a  sc/appendvfs.c *
1ce00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ce10 2a 2a 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/./**********
1ce20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1ce30 42 65 67 69 6e 20 2e 2e 2f 65 78 74 2f 6d 69 73  Begin ../ext/mis
1ce40 63 2f 6d 65 6d 74 72 61 63 65 2e 63 20 2a 2a 2a  c/memtrace.c ***
1ce50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1ce60 0a 2f 2a 0a 2a 2a 20 32 30 31 39 2d 30 31 2d 32  ./*.** 2019-01-2
1ce70 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
1ce80 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
1ce90 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
1cea0 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
1ceb0 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
1cec0 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
1ced0 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
1cee0 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
1cef0 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
1cf00 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
1cf10 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
1cf20 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
1cf30 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
1cf40 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
1cf50 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
1cf60 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
1cf70 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
1cf80 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
1cf90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cfa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cfb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cfc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cfd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
1cfe0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65   implements an e
1cff0 78 74 65 6e 73 69 6f 6e 20 74 68 61 74 20 75 73  xtension that us
1d000 65 73 20 74 68 65 20 53 51 4c 49 54 45 5f 43 4f  es the SQLITE_CO
1d010 4e 46 49 47 5f 4d 41 4c 4c 4f 43 0a 2a 2a 20 6d  NFIG_MALLOC.** m
1d020 65 63 68 61 6e 69 73 6d 20 74 6f 20 61 64 64 20  echanism to add 
1d030 61 20 74 72 61 63 69 6e 67 20 6c 61 79 65 72 20  a tracing layer 
1d040 6f 6e 20 74 6f 70 20 6f 66 20 53 51 4c 69 74 65  on top of SQLite
1d050 2e 20 20 49 66 20 74 68 69 73 20 65 78 74 65 6e  .  If this exten
1d060 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 67 69 73  sion.** is regis
1d070 74 65 72 65 64 20 70 72 69 6f 72 20 74 6f 20 73  tered prior to s
1d080 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1d090 65 28 29 2c 20 69 74 20 77 69 6c 6c 20 63 61 75  e(), it will cau
1d0a0 73 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 2a 2a  se all memory.**
1d0b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 63 74 69   allocation acti
1d0c0 76 69 74 69 65 73 20 74 6f 20 62 65 20 6c 6f 67  vities to be log
1d0d0 67 65 64 20 6f 6e 20 73 74 61 6e 64 61 72 64 20  ged on standard 
1d0e0 6f 75 74 70 75 74 2c 20 6f 72 20 74 6f 20 73 6f  output, or to so
1d0f0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 46 49 4c 45  me other.** FILE
1d100 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
1d110 65 20 69 6e 69 74 69 61 6c 69 7a 65 72 2e 0a 2a  e initializer..*
1d120 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 6e  *.** This file n
1d130 65 65 64 73 20 74 6f 20 62 65 20 63 6f 6d 70 69  eeds to be compi
1d140 6c 65 64 20 69 6e 74 6f 20 74 68 65 20 61 70 70  led into the app
1d150 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 20 75 73  lication that us
1d160 65 73 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  es it..**.** Thi
1d170 73 20 65 78 74 65 6e 73 69 6f 6e 20 69 73 20 75  s extension is u
1d180 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1d190 20 74 68 65 20 2d 2d 6d 65 6d 74 72 61 63 65 20   the --memtrace 
1d1a0 6f 70 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  option of the.**
1d1b0 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73 68   command-line sh
1d1c0 65 6c 6c 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ell..*/.#include
1d1d0 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
1d1e0 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
1d1f0 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
1d200 68 3e 0a 0a 2f 2a 20 54 68 65 20 6f 72 69 67 69  h>../* The origi
1d210 6e 61 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  nal memory alloc
1d220 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 2a  ation routines *
1d230 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1d240 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 6d 65 6d  _mem_methods mem
1d250 74 72 61 63 65 42 61 73 65 3b 0a 73 74 61 74 69  traceBase;.stati
1d260 63 20 46 49 4c 45 20 2a 6d 65 6d 74 72 61 63 65  c FILE *memtrace
1d270 4f 75 74 3b 0a 0a 2f 2a 20 4d 65 74 68 6f 64 73  Out;../* Methods
1d280 20 74 68 61 74 20 74 72 61 63 65 20 6d 65 6d 6f   that trace memo
1d290 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 2a  ry allocations *
1d2a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6d  /.static void *m
1d2b0 65 6d 74 72 61 63 65 4d 61 6c 6c 6f 63 28 69 6e  emtraceMalloc(in
1d2c0 74 20 6e 29 7b 0a 20 20 69 66 28 20 6d 65 6d 74  t n){.  if( memt
1d2d0 72 61 63 65 4f 75 74 20 29 7b 0a 20 20 20 20 66  raceOut ){.    f
1d2e0 70 72 69 6e 74 66 28 6d 65 6d 74 72 61 63 65 4f  printf(memtraceO
1d2f0 75 74 2c 20 22 4d 45 4d 54 52 41 43 45 3a 20 61  ut, "MEMTRACE: a
1d300 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74 65 73  llocate %d bytes
1d310 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1d320 20 20 6d 65 6d 74 72 61 63 65 42 61 73 65 2e 78    memtraceBase.x
1d330 52 6f 75 6e 64 75 70 28 6e 29 29 3b 0a 20 20 7d  Roundup(n));.  }
1d340 0a 20 20 72 65 74 75 72 6e 20 6d 65 6d 74 72 61  .  return memtra
1d350 63 65 42 61 73 65 2e 78 4d 61 6c 6c 6f 63 28 6e  ceBase.xMalloc(n
1d360 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1d370 20 6d 65 6d 74 72 61 63 65 46 72 65 65 28 76 6f   memtraceFree(vo
1d380 69 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  id *p){.  if( p=
1d390 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1d3a0 66 28 20 6d 65 6d 74 72 61 63 65 4f 75 74 20 29  f( memtraceOut )
1d3b0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6d 65  {.    fprintf(me
1d3c0 6d 74 72 61 63 65 4f 75 74 2c 20 22 4d 45 4d 54  mtraceOut, "MEMT
1d3d0 52 41 43 45 3a 20 66 72 65 65 20 25 64 20 62 79  RACE: free %d by
1d3e0 74 65 73 5c 6e 22 2c 20 6d 65 6d 74 72 61 63 65  tes\n", memtrace
1d3f0 42 61 73 65 2e 78 53 69 7a 65 28 70 29 29 3b 0a  Base.xSize(p));.
1d400 20 20 7d 0a 20 20 6d 65 6d 74 72 61 63 65 42 61    }.  memtraceBa
1d410 73 65 2e 78 46 72 65 65 28 70 29 3b 0a 7d 0a 73  se.xFree(p);.}.s
1d420 74 61 74 69 63 20 76 6f 69 64 20 2a 6d 65 6d 74  tatic void *memt
1d430 72 61 63 65 52 65 61 6c 6c 6f 63 28 76 6f 69 64  raceRealloc(void
1d440 20 2a 70 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *p, int n){.  i
1d450 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1d460 20 6d 65 6d 74 72 61 63 65 4d 61 6c 6c 6f 63 28   memtraceMalloc(
1d470 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  n);.  if( n==0 )
1d480 7b 0a 20 20 20 20 6d 65 6d 74 72 61 63 65 46 72  {.    memtraceFr
1d490 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
1d4a0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  n 0;.  }.  if( m
1d4b0 65 6d 74 72 61 63 65 4f 75 74 20 29 7b 0a 20 20  emtraceOut ){.  
1d4c0 20 20 66 70 72 69 6e 74 66 28 6d 65 6d 74 72 61    fprintf(memtra
1d4d0 63 65 4f 75 74 2c 20 22 4d 45 4d 54 52 41 43 45  ceOut, "MEMTRACE
1d4e0 3a 20 72 65 73 69 7a 65 20 25 64 20 2d 3e 20 25  : resize %d -> %
1d4f0 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
1d500 20 20 20 20 20 20 20 20 6d 65 6d 74 72 61 63 65          memtrace
1d510 42 61 73 65 2e 78 53 69 7a 65 28 70 29 2c 20 6d  Base.xSize(p), m
1d520 65 6d 74 72 61 63 65 42 61 73 65 2e 78 52 6f 75  emtraceBase.xRou
1d530 6e 64 75 70 28 6e 29 29 3b 0a 20 20 7d 0a 20 20  ndup(n));.  }.  
1d540 72 65 74 75 72 6e 20 6d 65 6d 74 72 61 63 65 42  return memtraceB
1d550 61 73 65 2e 78 52 65 61 6c 6c 6f 63 28 70 2c 20  ase.xRealloc(p, 
1d560 6e 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  n);.}.static int
1d570 20 6d 65 6d 74 72 61 63 65 53 69 7a 65 28 76 6f   memtraceSize(vo
1d580 69 64 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  id *p){.  return
1d590 20 6d 65 6d 74 72 61 63 65 42 61 73 65 2e 78 53   memtraceBase.xS
1d5a0 69 7a 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63  ize(p);.}.static
1d5b0 20 69 6e 74 20 6d 65 6d 74 72 61 63 65 52 6f 75   int memtraceRou
1d5c0 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
1d5d0 65 74 75 72 6e 20 6d 65 6d 74 72 61 63 65 42 61  eturn memtraceBa
1d5e0 73 65 2e 78 52 6f 75 6e 64 75 70 28 6e 29 3b 0a  se.xRoundup(n);.
1d5f0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  }.static int mem
1d600 74 72 61 63 65 49 6e 69 74 28 76 6f 69 64 20 2a  traceInit(void *
1d610 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 6d 65 6d  p){.  return mem
1d620 74 72 61 63 65 42 61 73 65 2e 78 49 6e 69 74 28  traceBase.xInit(
1d630 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  p);.}.static voi
1d640 64 20 6d 65 6d 74 72 61 63 65 53 68 75 74 64 6f  d memtraceShutdo
1d650 77 6e 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 6d  wn(void *p){.  m
1d660 65 6d 74 72 61 63 65 42 61 73 65 2e 78 53 68 75  emtraceBase.xShu
1d670 74 64 6f 77 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 20  tdown(p);.}../* 
1d680 54 68 65 20 73 75 62 73 74 69 74 75 74 65 20 6d  The substitute m
1d690 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20  emory allocator 
1d6a0 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1d6b0 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 65 72  3_mem_methods er
1d6c0 73 61 7a 74 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  saztMethods = {.
1d6d0 20 20 6d 65 6d 74 72 61 63 65 4d 61 6c 6c 6f 63    memtraceMalloc
1d6e0 2c 0a 20 20 6d 65 6d 74 72 61 63 65 46 72 65 65  ,.  memtraceFree
1d6f0 2c 0a 20 20 6d 65 6d 74 72 61 63 65 52 65 61 6c  ,.  memtraceReal
1d700 6c 6f 63 2c 0a 20 20 6d 65 6d 74 72 61 63 65 53  loc,.  memtraceS
1d710 69 7a 65 2c 0a 20 20 6d 65 6d 74 72 61 63 65 52  ize,.  memtraceR
1d720 6f 75 6e 64 75 70 2c 0a 20 20 6d 65 6d 74 72 61  oundup,.  memtra
1d730 63 65 49 6e 69 74 2c 0a 20 20 6d 65 6d 74 72 61  ceInit,.  memtra
1d740 63 65 53 68 75 74 64 6f 77 6e 2c 0a 20 20 30 0a  ceShutdown,.  0.
1d750 7d 3b 0a 0a 2f 2a 20 42 65 67 69 6e 20 74 72 61  };../* Begin tra
1d760 63 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  cing memory allo
1d770 63 61 74 69 6f 6e 73 20 74 6f 20 6f 75 74 2e 20  cations to out. 
1d780 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
1d790 6d 54 72 61 63 65 41 63 74 69 76 61 74 65 28 46  mTraceActivate(F
1d7a0 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 69 6e 74  ILE *out){.  int
1d7b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d7c0 0a 20 20 69 66 28 20 6d 65 6d 74 72 61 63 65 42  .  if( memtraceB
1d7d0 61 73 65 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29  ase.xMalloc==0 )
1d7e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1d7f0 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
1d800 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
1d810 43 2c 20 26 6d 65 6d 74 72 61 63 65 42 61 73 65  C, &memtraceBase
1d820 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d840 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1d850 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
1d860 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 26 65 72 73  FIG_MALLOC, &ers
1d870 61 7a 74 4d 65 74 68 6f 64 73 29 3b 0a 20 20 20  aztMethods);.   
1d880 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 74 72 61 63   }.  }.  memtrac
1d890 65 4f 75 74 20 3d 20 6f 75 74 3b 0a 20 20 72 65  eOut = out;.  re
1d8a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 44  turn rc;.}../* D
1d8b0 65 61 63 74 69 76 61 74 65 20 6d 65 6d 6f 72 79  eactivate memory
1d8c0 20 74 72 61 63 69 6e 67 20 2a 2f 0a 69 6e 74 20   tracing */.int 
1d8d0 73 71 6c 69 74 65 33 4d 65 6d 54 72 61 63 65 44  sqlite3MemTraceD
1d8e0 65 61 63 74 69 76 61 74 65 28 76 6f 69 64 29 7b  eactivate(void){
1d8f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1d900 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 6d 65 6d  TE_OK;.  if( mem
1d910 74 72 61 63 65 42 61 73 65 2e 78 4d 61 6c 6c 6f  traceBase.xMallo
1d920 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c!=0 ){.    rc =
1d930 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
1d940 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
1d950 4c 4c 4f 43 2c 20 26 6d 65 6d 74 72 61 63 65 42  LLOC, &memtraceB
1d960 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ase);.    if( rc
1d970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d980 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6d 65 6d       memset(&mem
1d990 74 72 61 63 65 42 61 73 65 2c 20 30 2c 20 73 69  traceBase, 0, si
1d9a0 7a 65 6f 66 28 6d 65 6d 74 72 61 63 65 42 61 73  zeof(memtraceBas
1d9b0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
1d9c0 20 6d 65 6d 74 72 61 63 65 4f 75 74 20 3d 20 30   memtraceOut = 0
1d9d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d9e0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1d9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1da00 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 6d 65 6d   ../ext/misc/mem
1da10 74 72 61 63 65 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a  trace.c ********
1da20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 69  ************/.#i
1da30 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45  fdef SQLITE_HAVE
1da40 5f 5a 4c 49 42 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  _ZLIB./*********
1da50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da60 20 42 65 67 69 6e 20 2e 2e 2f 65 78 74 2f 6d 69   Begin ../ext/mi
1da70 73 63 2f 7a 69 70 66 69 6c 65 2e 63 20 2a 2a 2a  sc/zipfile.c ***
1da80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1da90 0a 2f 2a 0a 2a 2a 20 32 30 31 37 2d 31 32 2d 32  ./*.** 2017-12-2
1daa0 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  6.**.** The auth
1dab0 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
1dac0 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
1dad0 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
1dae0 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
1daf0 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
1db00 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
1db10 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
1db20 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
1db30 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
1db40 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
1db50 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
1db60 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
1db70 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
1db80 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
1db90 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
1dba0 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
1dbb0 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
1dbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dc00 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
1dc10 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73   file implements
1dc20 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
1dc30 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64   for reading and
1dc40 20 77 72 69 74 69 6e 67 20 5a 49 50 20 61 72 63   writing ZIP arc
1dc50 68 69 76 65 0a 2a 2a 20 66 69 6c 65 73 2e 0a 2a  hive.** files..*
1dc60 2a 0a 2a 2a 20 55 73 61 67 65 20 65 78 61 6d 70  *.** Usage examp
1dc70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  le:.**.**     SE
1dc80 4c 45 43 54 20 6e 61 6d 65 2c 20 73 7a 2c 20 64  LECT name, sz, d
1dc90 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 27 75  atetime(mtime,'u
1dca0 6e 69 78 65 70 6f 63 68 27 29 20 46 52 4f 4d 20  nixepoch') FROM 
1dcb0 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 6e 61 6d  zipfile($filenam
1dcc0 65 29 3b 0a 2a 2a 0a 2a 2a 20 43 75 72 72 65 6e  e);.**.** Curren
1dcd0 74 20 6c 69 6d 69 74 61 74 69 6f 6e 73 3a 0a 2a  t limitations:.*
1dce0 2a 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f 20 73 75  *.**    *  No su
1dcf0 70 70 6f 72 74 20 66 6f 72 20 65 6e 63 72 79 70  pport for encryp
1dd00 74 69 6f 6e 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f  tion.**    *  No
1dd10 20 73 75 70 70 6f 72 74 20 66 6f 72 20 5a 49 50   support for ZIP
1dd20 20 61 72 63 68 69 76 65 73 20 73 70 61 6e 6e 69   archives spanni
1dd30 6e 67 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65  ng multiple file
1dd40 73 0a 2a 2a 20 20 20 20 2a 20 20 4e 6f 20 73 75  s.**    *  No su
1dd50 70 70 6f 72 74 20 66 6f 72 20 7a 69 70 36 34 20  pport for zip64 
1dd60 65 78 74 65 6e 73 69 6f 6e 73 0a 2a 2a 20 20 20  extensions.**   
1dd70 20 2a 20 20 4f 6e 6c 79 20 74 68 65 20 22 69 6e   *  Only the "in
1dd80 66 6c 61 74 65 2f 64 65 66 6c 61 74 65 22 20 28  flate/deflate" (
1dd90 7a 6c 69 62 29 20 63 6f 6d 70 72 65 73 73 69 6f  zlib) compressio
1dda0 6e 20 6d 65 74 68 6f 64 20 69 73 20 73 75 70 70  n method is supp
1ddb0 6f 72 74 65 64 0a 2a 2f 0a 53 51 4c 49 54 45 5f  orted.*/.SQLITE_
1ddc0 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
1ddd0 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
1dde0 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
1ddf0 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
1de00 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 23 69 6e 63  <assert.h>..#inc
1de10 6c 75 64 65 20 3c 7a 6c 69 62 2e 68 3e 0a 0a 23  lude <zlib.h>..#
1de20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1de30 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1de40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1de50 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 0a 2f 2a  AMALGAMATION../*
1de60 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
1de70 5f 69 6e 74 36 34 20 69 36 34 3b 20 2a 2f 0a 2f  _int64 i64; */./
1de80 2a 20 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e  * typedef unsign
1de90 65 64 20 63 68 61 72 20 75 38 3b 20 2a 2f 0a 74  ed char u8; */.t
1dea0 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
1deb0 73 68 6f 72 74 20 75 31 36 3b 0a 74 79 70 65 64  short u16;.typed
1dec0 65 66 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ef unsigned long
1ded0 20 75 33 32 3b 0a 23 64 65 66 69 6e 65 20 4d 49   u32;.#define MI
1dee0 4e 28 61 2c 62 29 20 28 28 61 29 3c 28 62 29 20  N(a,b) ((a)<(b) 
1def0 3f 20 28 61 29 20 3a 20 28 62 29 29 0a 0a 23 69  ? (a) : (b))..#i
1df00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1df10 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20  _COVERAGE_TEST) 
1df20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1df30 45 5f 4d 55 54 41 54 49 4f 4e 5f 54 45 53 54 29  E_MUTATION_TEST)
1df40 0a 23 20 64 65 66 69 6e 65 20 41 4c 57 41 59 53  .# define ALWAYS
1df50 28 58 29 20 20 20 20 20 20 28 31 29 0a 23 20 64  (X)      (1).# d
1df60 65 66 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20  efine NEVER(X)  
1df70 20 20 20 20 20 28 30 29 0a 23 65 6c 69 66 20 21       (0).#elif !
1df80 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 0a  defined(NDEBUG).
1df90 23 20 64 65 66 69 6e 65 20 41 4c 57 41 59 53 28  # define ALWAYS(
1dfa0 58 29 20 20 20 20 20 20 28 28 58 29 3f 31 3a 28  X)      ((X)?1:(
1dfb0 61 73 73 65 72 74 28 30 29 2c 30 29 29 0a 23 20  assert(0),0)).# 
1dfc0 64 65 66 69 6e 65 20 4e 45 56 45 52 28 58 29 20  define NEVER(X) 
1dfd0 20 20 20 20 20 20 28 28 58 29 3f 28 61 73 73 65        ((X)?(asse
1dfe0 72 74 28 30 29 2c 31 29 3a 30 29 0a 23 65 6c 73  rt(0),1):0).#els
1dff0 65 0a 23 20 64 65 66 69 6e 65 20 41 4c 57 41 59  e.# define ALWAY
1e000 53 28 58 29 20 20 20 20 20 20 28 58 29 0a 23 20  S(X)      (X).# 
1e010 64 65 66 69 6e 65 20 4e 45 56 45 52 28 58 29 20  define NEVER(X) 
1e020 20 20 20 20 20 20 28 58 29 0a 23 65 6e 64 69 66        (X).#endif
1e030 0a 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ..#endif   /* SQ
1e040 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
1e050 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  N */../*.** Defi
1e060 6e 69 74 69 6f 6e 73 20 66 6f 72 20 6d 6f 64 65  nitions for mode
1e070 20 62 69 74 6d 61 73 6b 73 20 53 5f 49 46 44 49   bitmasks S_IFDI
1e080 52 2c 20 53 5f 49 46 52 45 47 20 61 6e 64 20 53  R, S_IFREG and S
1e090 5f 49 46 4c 4e 4b 2e 0a 2a 2a 0a 2a 2a 20 49 6e  _IFLNK..**.** In
1e0a0 20 73 6f 6d 65 20 77 61 79 73 20 69 74 20 77 6f   some ways it wo
1e0b0 75 6c 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  uld be better to
1e0c0 20 6f 62 74 61 69 6e 20 74 68 65 73 65 20 76 61   obtain these va
1e0d0 6c 75 65 73 20 66 72 6f 6d 20 73 79 73 74 65 6d  lues from system
1e0e0 20 0a 2a 2a 20 68 65 61 64 65 72 20 66 69 6c 65   .** header file
1e0f0 73 2e 20 42 75 74 2c 20 74 68 65 20 64 65 70 65  s. But, the depe
1e100 6e 64 65 6e 63 79 20 69 73 20 75 6e 64 65 73 69  ndency is undesi
1e110 72 61 62 6c 65 20 61 6e 64 20 28 61 29 20 74 68  rable and (a) th
1e120 65 73 65 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ese.** have been
1e130 20 73 74 61 62 6c 65 20 66 6f 72 20 64 65 63 61   stable for deca
1e140 64 65 73 2c 20 28 62 29 20 74 68 65 20 76 61 6c  des, (b) the val
1e150 75 65 73 20 61 72 65 20 70 61 72 74 20 6f 66 20  ues are part of 
1e160 50 4f 53 49 58 20 61 6e 64 0a 2a 2a 20 61 72 65  POSIX and.** are
1e170 20 61 6c 73 6f 20 6d 61 64 65 20 65 78 70 6c 69   also made expli
1e180 63 69 74 20 69 6e 20 5b 6d 61 6e 20 73 74 61 74  cit in [man stat
1e190 5d 2c 20 61 6e 64 20 28 63 29 20 61 72 65 20 70  ], and (c) are p
1e1a0 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  art of the .** f
1e1b0 69 6c 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 7a  ile format for z
1e1c0 69 70 20 61 72 63 68 69 76 65 73 2e 0a 2a 2f 0a  ip archives..*/.
1e1d0 23 69 66 6e 64 65 66 20 53 5f 49 46 44 49 52 0a  #ifndef S_IFDIR.
1e1e0 23 20 64 65 66 69 6e 65 20 53 5f 49 46 44 49 52  # define S_IFDIR
1e1f0 20 30 30 34 30 30 30 30 0a 23 65 6e 64 69 66 0a   0040000.#endif.
1e200 23 69 66 6e 64 65 66 20 53 5f 49 46 52 45 47 0a  #ifndef S_IFREG.
1e210 23 20 64 65 66 69 6e 65 20 53 5f 49 46 52 45 47  # define S_IFREG
1e220 20 30 31 30 30 30 30 30 0a 23 65 6e 64 69 66 0a   0100000.#endif.
1e230 23 69 66 6e 64 65 66 20 53 5f 49 46 4c 4e 4b 0a  #ifndef S_IFLNK.
1e240 23 20 64 65 66 69 6e 65 20 53 5f 49 46 4c 4e 4b  # define S_IFLNK
1e250 20 30 31 32 30 30 30 30 0a 23 65 6e 64 69 66 0a   0120000.#endif.
1e260 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1e270 61 72 20 5a 49 50 46 49 4c 45 5f 53 43 48 45 4d  ar ZIPFILE_SCHEM
1e280 41 5b 5d 20 3d 20 0a 20 20 22 43 52 45 41 54 45  A[] = .  "CREATE
1e290 20 54 41 42 4c 45 20 79 28 22 0a 20 20 20 20 22   TABLE y(".    "
1e2a0 6e 61 6d 65 20 50 52 49 4d 41 52 59 20 4b 45 59  name PRIMARY KEY
1e2b0 2c 22 20 20 2f 2a 20 30 3a 20 4e 61 6d 65 20 6f  ,"  /* 0: Name o
1e2c0 66 20 66 69 6c 65 20 69 6e 20 7a 69 70 20 61 72  f file in zip ar
1e2d0 63 68 69 76 65 20 2a 2f 0a 20 20 20 20 22 6d 6f  chive */.    "mo
1e2e0 64 65 2c 22 20 20 20 20 20 20 20 20 20 20 20 20  de,"            
1e2f0 20 20 2f 2a 20 31 3a 20 50 4f 53 49 58 20 6d 6f    /* 1: POSIX mo
1e300 64 65 20 66 6f 72 20 66 69 6c 65 20 2a 2f 0a 20  de for file */. 
1e310 20 20 20 22 6d 74 69 6d 65 2c 22 20 20 20 20 20     "mtime,"     
1e320 20 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 4c 61          /* 2: La
1e330 73 74 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  st modification 
1e340 74 69 6d 65 20 28 73 65 63 73 20 73 69 6e 63 65  time (secs since
1e350 20 31 39 37 30 29 2a 2f 0a 20 20 20 20 22 73 7a   1970)*/.    "sz
1e360 2c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,"              
1e370 20 20 2f 2a 20 33 3a 20 53 69 7a 65 20 6f 66 20    /* 3: Size of 
1e380 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 22 72  object */.    "r
1e390 61 77 64 61 74 61 2c 22 20 20 20 20 20 20 20 20  awdata,"        
1e3a0 20 20 20 2f 2a 20 34 3a 20 52 61 77 20 64 61 74     /* 4: Raw dat
1e3b0 61 20 2a 2f 0a 20 20 20 20 22 64 61 74 61 2c 22  a */.    "data,"
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e3d0 20 35 3a 20 55 6e 63 6f 6d 70 72 65 73 73 65 64   5: Uncompressed
1e3e0 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 22 6d 65   data */.    "me
1e3f0 74 68 6f 64 2c 22 20 20 20 20 20 20 20 20 20 20  thod,"          
1e400 20 20 2f 2a 20 36 3a 20 43 6f 6d 70 72 65 73 73    /* 6: Compress
1e410 69 6f 6e 20 6d 65 74 68 6f 64 20 28 69 6e 74 65  ion method (inte
1e420 67 65 72 29 20 2a 2f 0a 20 20 20 20 22 7a 20 48  ger) */.    "z H
1e430 49 44 44 45 4e 22 20 20 20 20 20 20 20 20 20 20  IDDEN"          
1e440 20 2f 2a 20 37 3a 20 4e 61 6d 65 20 6f 66 20 7a   /* 7: Name of z
1e450 69 70 20 66 69 6c 65 20 2a 2f 0a 20 20 22 29 20  ip file */.  ") 
1e460 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 3b  WITHOUT ROWID;";
1e470 0a 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c  ..#define ZIPFIL
1e480 45 5f 46 5f 43 4f 4c 55 4d 4e 5f 49 44 58 20 37  E_F_COLUMN_IDX 7
1e490 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1e4a0 63 6f 6c 75 6d 6e 20 22 66 69 6c 65 22 20 69 6e  column "file" in
1e4b0 20 74 68 65 20 61 62 6f 76 65 20 2a 2f 0a 23 64   the above */.#d
1e4c0 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 42 55  efine ZIPFILE_BU
1e4d0 46 46 45 52 5f 53 49 5a 45 20 28 36 34 2a 31 30  FFER_SIZE (64*10
1e4e0 32 34 29 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69  24).../*.** Magi
1e4f0 63 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 74  c numbers used t
1e500 6f 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  o read and write
1e510 20 7a 69 70 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   zip files..**.*
1e520 2a 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45 4e 54  * ZIPFILE_NEWENT
1e530 52 59 5f 4d 41 44 45 42 59 3a 0a 2a 2a 20 20 20  RY_MADEBY:.**   
1e540 55 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 66  Use this value f
1e550 6f 72 20 74 68 65 20 22 76 65 72 73 69 6f 6e 2d  or the "version-
1e560 6d 61 64 65 2d 62 79 22 20 66 69 65 6c 64 20 69  made-by" field i
1e570 6e 20 6e 65 77 20 7a 69 70 20 66 69 6c 65 0a 2a  n new zip file.*
1e580 2a 20 20 20 65 6e 74 72 69 65 73 2e 20 54 68 65  *   entries. The
1e590 20 75 70 70 65 72 20 62 79 74 65 20 69 6e 64 69   upper byte indi
1e5a0 63 61 74 65 73 20 22 75 6e 69 78 22 2c 20 61 6e  cates "unix", an
1e5b0 64 20 74 68 65 20 6c 6f 77 65 72 20 62 79 74 65  d the lower byte
1e5c0 20 0a 2a 2a 20 20 20 69 6e 64 69 63 61 74 65 73   .**   indicates
1e5d0 20 74 68 61 74 20 74 68 65 20 7a 69 70 20 66 69   that the zip fi
1e5e0 6c 65 20 6d 61 74 63 68 65 73 20 70 6b 7a 69 70  le matches pkzip
1e5f0 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 33   specification 3
1e600 2e 30 2e 20 0a 2a 2a 20 20 20 54 68 69 73 20 69  .0. .**   This i
1e610 73 20 77 68 61 74 20 69 6e 66 6f 2d 7a 69 70 20  s what info-zip 
1e620 73 65 65 6d 73 20 74 6f 20 64 6f 2e 0a 2a 2a 0a  seems to do..**.
1e630 2a 2a 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45 4e  ** ZIPFILE_NEWEN
1e640 54 52 59 5f 52 45 51 55 49 52 45 44 3a 0a 2a 2a  TRY_REQUIRED:.**
1e650 20 20 20 56 61 6c 75 65 20 66 6f 72 20 22 76 65     Value for "ve
1e660 72 73 69 6f 6e 2d 72 65 71 75 69 72 65 64 2d 74  rsion-required-t
1e670 6f 2d 65 78 74 72 61 63 74 22 20 66 69 65 6c 64  o-extract" field
1e680 20 6f 66 20 6e 65 77 20 65 6e 74 72 69 65 73 2e   of new entries.
1e690 0a 2a 2a 20 20 20 56 65 72 73 69 6f 6e 20 32 2e  .**   Version 2.
1e6a0 30 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  0 is required to
1e6b0 20 73 75 70 70 6f 72 74 20 66 6f 6c 64 65 72 73   support folders
1e6c0 20 61 6e 64 20 64 65 66 6c 61 74 65 20 63 6f 6d   and deflate com
1e6d0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
1e6e0 5a 49 50 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59  ZIPFILE_NEWENTRY
1e6f0 5f 46 4c 41 47 53 3a 0a 2a 2a 20 20 20 56 61 6c  _FLAGS:.**   Val
1e700 75 65 20 66 6f 72 20 22 67 65 6e 65 72 61 6c 2d  ue for "general-
1e710 70 75 72 70 6f 73 65 2d 62 69 74 2d 66 6c 61 67  purpose-bit-flag
1e720 73 22 20 66 69 65 6c 64 20 6f 66 20 6e 65 77 20  s" field of new 
1e730 65 6e 74 72 69 65 73 2e 20 42 69 74 0a 2a 2a 20  entries. Bit.** 
1e740 20 20 31 31 20 6d 65 61 6e 73 20 22 75 74 66 2d    11 means "utf-
1e750 38 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 63  8 filename and c
1e760 6f 6d 6d 65 6e 74 22 2e 0a 2a 2a 0a 2a 2a 20 5a  omment"..**.** Z
1e770 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45  IPFILE_SIGNATURE
1e780 5f 43 44 53 3a 0a 2a 2a 20 20 20 46 69 72 73 74  _CDS:.**   First
1e790 20 34 20 62 79 74 65 73 20 6f 66 20 61 20 76 61   4 bytes of a va
1e7a0 6c 69 64 20 43 44 53 20 72 65 63 6f 72 64 2e 0a  lid CDS record..
1e7b0 2a 2a 0a 2a 2a 20 5a 49 50 46 49 4c 45 5f 53 49  **.** ZIPFILE_SI
1e7c0 47 4e 41 54 55 52 45 5f 4c 46 48 3a 0a 2a 2a 20  GNATURE_LFH:.** 
1e7d0 20 20 46 69 72 73 74 20 34 20 62 79 74 65 73 20    First 4 bytes 
1e7e0 6f 66 20 61 20 76 61 6c 69 64 20 4c 46 48 20 72  of a valid LFH r
1e7f0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 5a 49 50  ecord..**.** ZIP
1e800 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f 45  FILE_SIGNATURE_E
1e810 4f 43 44 0a 2a 2a 20 20 20 46 69 72 73 74 20 34  OCD.**   First 4
1e820 20 62 79 74 65 73 20 6f 66 20 61 20 76 61 6c 69   bytes of a vali
1e830 64 20 45 4f 43 44 20 72 65 63 6f 72 64 2e 0a 2a  d EOCD record..*
1e840 2f 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c  /.#define ZIPFIL
1e850 45 5f 45 58 54 52 41 5f 54 49 4d 45 53 54 41 4d  E_EXTRA_TIMESTAM
1e860 50 20 20 20 30 78 35 34 35 35 0a 23 64 65 66 69  P   0x5455.#defi
1e870 6e 65 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45 4e  ne ZIPFILE_NEWEN
1e880 54 52 59 5f 4d 41 44 45 42 59 20 20 20 28 28 33  TRY_MADEBY   ((3
1e890 3c 3c 38 29 20 2b 20 33 30 29 0a 23 64 65 66 69  <<8) + 30).#defi
1e8a0 6e 65 20 5a 49 50 46 49 4c 45 5f 4e 45 57 45 4e  ne ZIPFILE_NEWEN
1e8b0 54 52 59 5f 52 45 51 55 49 52 45 44 20 32 30 0a  TRY_REQUIRED 20.
1e8c0 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f  #define ZIPFILE_
1e8d0 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47 53 20 20  NEWENTRY_FLAGS  
1e8e0 20 20 30 78 38 30 30 0a 23 64 65 66 69 6e 65 20    0x800.#define 
1e8f0 5a 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52  ZIPFILE_SIGNATUR
1e900 45 5f 43 44 53 20 20 20 20 20 30 78 30 32 30 31  E_CDS     0x0201
1e910 34 62 35 30 0a 23 64 65 66 69 6e 65 20 5a 49 50  4b50.#define ZIP
1e920 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f 4c  FILE_SIGNATURE_L
1e930 46 48 20 20 20 20 20 30 78 30 34 30 33 34 62 35  FH     0x04034b5
1e940 30 0a 23 64 65 66 69 6e 65 20 5a 49 50 46 49 4c  0.#define ZIPFIL
1e950 45 5f 53 49 47 4e 41 54 55 52 45 5f 45 4f 43 44  E_SIGNATURE_EOCD
1e960 20 20 20 20 30 78 30 36 30 35 34 62 35 30 0a 0a      0x06054b50..
1e970 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20  /*.** The sizes 
1e980 6f 66 20 74 68 65 20 66 69 78 65 64 2d 73 69 7a  of the fixed-siz
1e990 65 20 70 61 72 74 20 6f 66 20 65 61 63 68 20 6f  e part of each o
1e9a0 66 20 74 68 65 20 74 68 72 65 65 20 6d 61 69 6e  f the three main
1e9b0 20 64 61 74 61 20 0a 2a 2a 20 73 74 72 75 63 74   data .** struct
1e9c0 75 72 65 73 20 69 6e 20 61 20 7a 69 70 20 61 72  ures in a zip ar
1e9d0 63 68 69 76 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  chive..*/.#defin
1e9e0 65 20 5a 49 50 46 49 4c 45 5f 4c 46 48 5f 46 49  e ZIPFILE_LFH_FI
1e9f0 58 45 44 5f 53 5a 20 20 20 20 20 20 33 30 0a 23  XED_SZ      30.#
1ea00 64 65 66 69 6e 65 20 5a 49 50 46 49 4c 45 5f 45  define ZIPFILE_E
1ea10 4f 43 44 5f 46 49 58 45 44 5f 53 5a 20 20 20 20  OCD_FIXED_SZ    
1ea20 20 32 32 0a 23 64 65 66 69 6e 65 20 5a 49 50 46   22.#define ZIPF
1ea30 49 4c 45 5f 43 44 53 5f 46 49 58 45 44 5f 53 5a  ILE_CDS_FIXED_SZ
1ea40 20 20 20 20 20 20 34 36 0a 0a 2f 2a 0a 2a 2a 2a        46../*.***
1ea50 20 34 2e 33 2e 31 36 20 20 45 6e 64 20 6f 66 20   4.3.16  End of 
1ea60 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72  central director
1ea70 79 20 72 65 63 6f 72 64 3a 0a 2a 2a 2a 0a 2a 2a  y record:.***.**
1ea80 2a 20 20 20 65 6e 64 20 6f 66 20 63 65 6e 74 72  *   end of centr
1ea90 61 6c 20 64 69 72 20 73 69 67 6e 61 74 75 72 65  al dir signature
1eaa0 20 20 20 20 34 20 62 79 74 65 73 20 20 28 30 78      4 bytes  (0x
1eab0 30 36 30 35 34 62 35 30 29 0a 2a 2a 2a 20 20 20  06054b50).***   
1eac0 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 64  number of this d
1ead0 69 73 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  isk             
1eae0 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 6e 75  2 bytes.***   nu
1eaf0 6d 62 65 72 20 6f 66 20 74 68 65 20 64 69 73 6b  mber of the disk
1eb00 20 77 69 74 68 20 74 68 65 0a 2a 2a 2a 20 20 20   with the.***   
1eb10 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6e  start of the cen
1eb20 74 72 61 6c 20 64 69 72 65 63 74 6f 72 79 20 20  tral directory  
1eb30 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 74 6f  2 bytes.***   to
1eb40 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  tal number of en
1eb50 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 2a  tries in the.***
1eb60 20 20 20 63 65 6e 74 72 61 6c 20 64 69 72 65 63     central direc
1eb70 74 6f 72 79 20 6f 6e 20 74 68 69 73 20 64 69 73  tory on this dis
1eb80 6b 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20  k  2 bytes.***  
1eb90 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1eba0 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 2a 20   entries in.*** 
1ebb0 20 20 74 68 65 20 63 65 6e 74 72 61 6c 20 64 69    the central di
1ebc0 72 65 63 74 6f 72 79 20 20 20 20 20 20 20 20 20  rectory         
1ebd0 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20    2 bytes.***   
1ebe0 73 69 7a 65 20 6f 66 20 74 68 65 20 63 65 6e 74  size of the cent
1ebf0 72 61 6c 20 64 69 72 65 63 74 6f 72 79 20 20 20  ral directory   
1ec00 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 6f 66  4 bytes.***   of
1ec10 66 73 65 74 20 6f 66 20 73 74 61 72 74 20 6f 66  fset of start of
1ec20 20 63 65 6e 74 72 61 6c 0a 2a 2a 2a 20 20 20 64   central.***   d
1ec30 69 72 65 63 74 6f 72 79 20 77 69 74 68 20 72 65  irectory with re
1ec40 73 70 65 63 74 20 74 6f 0a 2a 2a 2a 20 20 20 74  spect to.***   t
1ec50 68 65 20 73 74 61 72 74 69 6e 67 20 64 69 73 6b  he starting disk
1ec60 20 6e 75 6d 62 65 72 20 20 20 20 20 20 20 20 34   number        4
1ec70 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 2e 5a 49   bytes.***   .ZI
1ec80 50 20 66 69 6c 65 20 63 6f 6d 6d 65 6e 74 20 6c  P file comment l
1ec90 65 6e 67 74 68 20 20 20 20 20 20 20 20 32 20 62  ength        2 b
1eca0 79 74 65 73 0a 2a 2a 2a 20 20 20 2e 5a 49 50 20  ytes.***   .ZIP 
1ecb0 66 69 6c 65 20 63 6f 6d 6d 65 6e 74 20 20 20 20  file comment    
1ecc0 20 20 20 28 76 61 72 69 61 62 6c 65 20 73 69 7a     (variable siz
1ecd0 65 29 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e).*/.typedef st
1ece0 72 75 63 74 20 5a 69 70 66 69 6c 65 45 4f 43 44  ruct ZipfileEOCD
1ecf0 20 5a 69 70 66 69 6c 65 45 4f 43 44 3b 0a 73 74   ZipfileEOCD;.st
1ed00 72 75 63 74 20 5a 69 70 66 69 6c 65 45 4f 43 44  ruct ZipfileEOCD
1ed10 20 7b 0a 20 20 75 31 36 20 69 44 69 73 6b 3b 0a   {.  u16 iDisk;.
1ed20 20 20 75 31 36 20 69 46 69 72 73 74 44 69 73 6b    u16 iFirstDisk
1ed30 3b 0a 20 20 75 31 36 20 6e 45 6e 74 72 79 3b 0a  ;.  u16 nEntry;.
1ed40 20 20 75 31 36 20 6e 45 6e 74 72 79 54 6f 74 61    u16 nEntryTota
1ed50 6c 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  l;.  u32 nSize;.
1ed60 20 20 75 33 32 20 69 4f 66 66 73 65 74 3b 0a 7d    u32 iOffset;.}
1ed70 3b 0a 0a 2f 2a 0a 2a 2a 2a 20 34 2e 33 2e 31 32  ;../*.*** 4.3.12
1ed80 20 20 43 65 6e 74 72 61 6c 20 64 69 72 65 63 74    Central direct
1ed90 6f 72 79 20 73 74 72 75 63 74 75 72 65 3a 0a 2a  ory structure:.*
1eda0 2a 2a 0a 2a 2a 2a 20 2e 2e 2e 0a 2a 2a 2a 0a 2a  **.*** ....***.*
1edb0 2a 2a 20 20 20 63 65 6e 74 72 61 6c 20 66 69 6c  **   central fil
1edc0 65 20 68 65 61 64 65 72 20 73 69 67 6e 61 74 75  e header signatu
1edd0 72 65 20 20 20 34 20 62 79 74 65 73 20 20 28 30  re   4 bytes  (0
1ede0 78 30 32 30 31 34 62 35 30 29 0a 2a 2a 2a 20 20  x02014b50).***  
1edf0 20 76 65 72 73 69 6f 6e 20 6d 61 64 65 20 62 79   version made by
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 76   2 bytes.***   v
1ee20 65 72 73 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f  ersion needed to
1ee30 20 65 78 74 72 61 63 74 20 20 20 20 20 20 20 32   extract       2
1ee40 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 67 65 6e   bytes.***   gen
1ee50 65 72 61 6c 20 70 75 72 70 6f 73 65 20 62 69 74  eral purpose bit
1ee60 20 66 6c 61 67 20 20 20 20 20 20 20 20 32 20 62   flag        2 b
1ee70 79 74 65 73 0a 2a 2a 2a 20 20 20 63 6f 6d 70 72  ytes.***   compr
1ee80 65 73 73 69 6f 6e 20 6d 65 74 68 6f 64 20 20 20  ession method   
1ee90 20 20 20 20 20 20 20 20 20 20 20 32 20 62 79 74             2 byt
1eea0 65 73 0a 2a 2a 2a 20 20 20 6c 61 73 74 20 6d 6f  es.***   last mo
1eeb0 64 20 66 69 6c 65 20 74 69 6d 65 20 20 20 20 20  d file time     
1eec0 20 20 20 20 20 20 20 20 20 32 20 62 79 74 65 73           2 bytes
1eed0 0a 2a 2a 2a 20 20 20 6c 61 73 74 20 6d 6f 64 20  .***   last mod 
1eee0 66 69 6c 65 20 64 61 74 65 20 20 20 20 20 20 20  file date       
1eef0 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a         2 bytes.*
1ef00 2a 2a 20 20 20 63 72 63 2d 33 32 20 20 20 20 20  **   crc-32     
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a       4 bytes.***
1ef30 20 20 20 63 6f 6d 70 72 65 73 73 65 64 20 73 69     compressed si
1ef40 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
1ef50 20 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20     4 bytes.***  
1ef60 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 73 69   uncompressed si
1ef70 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
1ef80 20 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 66   4 bytes.***   f
1ef90 69 6c 65 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20  ile name length 
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
1efb0 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 65 78 74   bytes.***   ext
1efc0 72 61 20 66 69 65 6c 64 20 6c 65 6e 67 74 68 20  ra field length 
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 62               2 b
1efe0 79 74 65 73 0a 2a 2a 2a 20 20 20 66 69 6c 65 20  ytes.***   file 
1eff0 63 6f 6d 6d 65 6e 74 20 6c 65 6e 67 74 68 20 20  comment length  
1f000 20 20 20 20 20 20 20 20 20 20 20 32 20 62 79 74             2 byt
1f010 65 73 0a 2a 2a 2a 20 20 20 64 69 73 6b 20 6e 75  es.***   disk nu
1f020 6d 62 65 72 20 73 74 61 72 74 20 20 20 20 20 20  mber start      
1f030 20 20 20 20 20 20 20 20 20 32 20 62 79 74 65 73           2 bytes
1f040 0a 2a 2a 2a 20 20 20 69 6e 74 65 72 6e 61 6c 20  .***   internal 
1f050 66 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 20  file attributes 
1f060 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a         2 bytes.*
1f070 2a 2a 20 20 20 65 78 74 65 72 6e 61 6c 20 66 69  **   external fi
1f080 6c 65 20 61 74 74 72 69 62 75 74 65 73 20 20 20  le attributes   
1f090 20 20 20 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a       4 bytes.***
1f0a0 20 20 20 72 65 6c 61 74 69 76 65 20 6f 66 66 73     relative offs
1f0b0 65 74 20 6f 66 20 6c 6f 63 61 6c 20 68 65 61 64  et of local head
1f0c0 65 72 20 34 20 62 79 74 65 73 0a 2a 2f 0a 74 79  er 4 bytes.*/.ty
1f0d0 70 65 64 65 66 20 73 74 72 75 63 74 20 5a 69 70  pedef struct Zip
1f0e0 66 69 6c 65 43 44 53 20 5a 69 70 66 69 6c 65 43  fileCDS ZipfileC
1f0f0 44 53 3b 0a 73 74 72 75 63 74 20 5a 69 70 66 69  DS;.struct Zipfi
1f100 6c 65 43 44 53 20 7b 0a 20 20 75 31 36 20 69 56  leCDS {.  u16 iV
1f110 65 72 73 69 6f 6e 4d 61 64 65 42 79 3b 0a 20 20  ersionMadeBy;.  
1f120 75 31 36 20 69 56 65 72 73 69 6f 6e 45 78 74 72  u16 iVersionExtr
1f130 61 63 74 3b 0a 20 20 75 31 36 20 66 6c 61 67 73  act;.  u16 flags
1f140 3b 0a 20 20 75 31 36 20 69 43 6f 6d 70 72 65 73  ;.  u16 iCompres
1f150 73 69 6f 6e 3b 0a 20 20 75 31 36 20 6d 54 69 6d  sion;.  u16 mTim
1f160 65 3b 0a 20 20 75 31 36 20 6d 44 61 74 65 3b 0a  e;.  u16 mDate;.
1f170 20 20 75 33 32 20 63 72 63 33 32 3b 0a 20 20 75    u32 crc32;.  u
1f180 33 32 20 73 7a 43 6f 6d 70 72 65 73 73 65 64 3b  32 szCompressed;
1f190 0a 20 20 75 33 32 20 73 7a 55 6e 63 6f 6d 70 72  .  u32 szUncompr
1f1a0 65 73 73 65 64 3b 0a 20 20 75 31 36 20 6e 46 69  essed;.  u16 nFi
1f1b0 6c 65 3b 0a 20 20 75 31 36 20 6e 45 78 74 72 61  le;.  u16 nExtra
1f1c0 3b 0a 20 20 75 31 36 20 6e 43 6f 6d 6d 65 6e 74  ;.  u16 nComment
1f1d0 3b 0a 20 20 75 31 36 20 69 44 69 73 6b 53 74 61  ;.  u16 iDiskSta
1f1e0 72 74 3b 0a 20 20 75 31 36 20 69 49 6e 74 65 72  rt;.  u16 iInter
1f1f0 6e 61 6c 41 74 74 72 3b 0a 20 20 75 33 32 20 69  nalAttr;.  u32 i
1f200 45 78 74 65 72 6e 61 6c 41 74 74 72 3b 0a 20 20  ExternalAttr;.  
1f210 75 33 32 20 69 4f 66 66 73 65 74 3b 0a 20 20 63  u32 iOffset;.  c
1f220 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f240 2a 20 46 69 6c 65 6e 61 6d 65 20 28 73 71 6c 69  * Filename (sqli
1f250 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 29 20 2a 2f  te3_malloc()) */
1f260 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 2a 20 34 2e 33 2e  .};../*.*** 4.3.
1f270 37 20 20 4c 6f 63 61 6c 20 66 69 6c 65 20 68 65  7  Local file he
1f280 61 64 65 72 3a 0a 2a 2a 2a 0a 2a 2a 2a 20 20 20  ader:.***.***   
1f290 6c 6f 63 61 6c 20 66 69 6c 65 20 68 65 61 64 65  local file heade
1f2a0 72 20 73 69 67 6e 61 74 75 72 65 20 20 20 20 20  r signature     
1f2b0 34 20 62 79 74 65 73 20 20 28 30 78 30 34 30 33  4 bytes  (0x0403
1f2c0 34 62 35 30 29 0a 2a 2a 2a 20 20 20 76 65 72 73  4b50).***   vers
1f2d0 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 65 78  ion needed to ex
1f2e0 74 72 61 63 74 20 20 20 20 20 20 20 32 20 62 79  tract       2 by
1f2f0 74 65 73 0a 2a 2a 2a 20 20 20 67 65 6e 65 72 61  tes.***   genera
1f300 6c 20 70 75 72 70 6f 73 65 20 62 69 74 20 66 6c  l purpose bit fl
1f310 61 67 20 20 20 20 20 20 20 20 32 20 62 79 74 65  ag        2 byte
1f320 73 0a 2a 2a 2a 20 20 20 63 6f 6d 70 72 65 73 73  s.***   compress
1f330 69 6f 6e 20 6d 65 74 68 6f 64 20 20 20 20 20 20  ion method      
1f340 20 20 20 20 20 20 20 20 32 20 62 79 74 65 73 0a          2 bytes.
1f350 2a 2a 2a 20 20 20 6c 61 73 74 20 6d 6f 64 20 66  ***   last mod f
1f360 69 6c 65 20 74 69 6d 65 20 20 20 20 20 20 20 20  ile time        
1f370 20 20 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a        2 bytes.**
1f380 2a 20 20 20 6c 61 73 74 20 6d 6f 64 20 66 69 6c  *   last mod fil
1f390 65 20 64 61 74 65 20 20 20 20 20 20 20 20 20 20  e date          
1f3a0 20 20 20 20 32 20 62 79 74 65 73 0a 2a 2a 2a 20      2 bytes.*** 
1f3b0 20 20 63 72 63 2d 33 32 20 20 20 20 20 20 20 20    crc-32        
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3d0 20 20 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20    4 bytes.***   
1f3e0 63 6f 6d 70 72 65 73 73 65 64 20 73 69 7a 65 20  compressed size 
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 34 20 62 79 74 65 73 0a 2a 2a 2a 20 20 20 75 6e  4 bytes.***   un
1f410 63 6f 6d 70 72 65 73 73 65 64 20 73 69 7a 65 20  compressed size 
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
1f430 62 79 74 65 73 0a 2a 2a 2a 20 20 20 66 69 6c 65  bytes.***   file
1f440 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 20 20 20   name length    
1f450 20 20 20 20 20 20 20 20 20 20 20 20 32 20 62 79              2 by
1f460 74 65 73 0a 2a 2a 2a 20 20 20 65 78 74 72 61 20  tes.***   extra 
1f470 66 69 65 6c 64 20 6c 65 6e 67 74 68 20 20 20 20  field length    
1f480 20 20 20 20 20 20 20 20 20 20 32 20 62 79 74 65            2 byte
1f490 73 0a 2a 2a 2a 20 20 20 0a 2a 2f 0a 74 79 70 65  s.***   .*/.type
1f4a0 64 65 66 20 73 74 72 75 63 74 20 5a 69 70 66 69  def struct Zipfi
1f4b0 6c 65 4c 46 48 20 5a 69 70 66 69 6c 65 4c 46 48  leLFH ZipfileLFH
1f4c0 3b 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65  ;.struct Zipfile
1f4d0 4c 46 48 20 7b 0a 20 20 75 31 36 20 69 56 65 72  LFH {.  u16 iVer
1f4e0 73 69 6f 6e 45 78 74 72 61 63 74 3b 0a 20 20 75  sionExtract;.  u
1f4f0 31 36 20 66 6c 61 67 73 3b 0a 20 20 75 31 36 20  16 flags;.  u16 
1f500 69 43 6f 6d 70 72 65 73 73 69 6f 6e 3b 0a 20 20  iCompression;.  
1f510 75 31 36 20 6d 54 69 6d 65 3b 0a 20 20 75 31 36  u16 mTime;.  u16
1f520 20 6d 44 61 74 65 3b 0a 20 20 75 33 32 20 63 72   mDate;.  u32 cr
1f530 63 33 32 3b 0a 20 20 75 33 32 20 73 7a 43 6f 6d  c32;.  u32 szCom
1f540 70 72 65 73 73 65 64 3b 0a 20 20 75 33 32 20 73  pressed;.  u32 s
1f550 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 3b 0a 20  zUncompressed;. 
1f560 20 75 31 36 20 6e 46 69 6c 65 3b 0a 20 20 75 31   u16 nFile;.  u1
1f570 36 20 6e 45 78 74 72 61 3b 0a 7d 3b 0a 0a 74 79  6 nExtra;.};..ty
1f580 70 65 64 65 66 20 73 74 72 75 63 74 20 5a 69 70  pedef struct Zip
1f590 66 69 6c 65 45 6e 74 72 79 20 5a 69 70 66 69 6c  fileEntry Zipfil
1f5a0 65 45 6e 74 72 79 3b 0a 73 74 72 75 63 74 20 5a  eEntry;.struct Z
1f5b0 69 70 66 69 6c 65 45 6e 74 72 79 20 7b 0a 20 20  ipfileEntry {.  
1f5c0 5a 69 70 66 69 6c 65 43 44 53 20 63 64 73 3b 20  ZipfileCDS cds; 
1f5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1f5e0 72 73 65 64 20 43 44 53 20 72 65 63 6f 72 64 20  rsed CDS record 
1f5f0 2a 2f 0a 20 20 75 33 32 20 6d 55 6e 69 78 54 69  */.  u32 mUnixTi
1f600 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
1f610 2f 2a 20 4d 6f 64 69 66 69 63 61 74 69 6f 6e 20  /* Modification 
1f620 74 69 6d 65 2c 20 69 6e 20 55 4e 49 58 20 66 6f  time, in UNIX fo
1f630 72 6d 61 74 20 2a 2f 0a 20 20 75 38 20 2a 61 45  rmat */.  u8 *aE
1f640 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
1f650 20 20 20 20 20 2f 2a 20 63 64 73 2e 6e 45 78 74       /* cds.nExt
1f660 72 61 2b 63 64 73 2e 6e 43 6f 6d 6d 65 6e 74 20  ra+cds.nComment 
1f670 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 64  bytes of extra d
1f680 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 44 61  ata */.  i64 iDa
1f690 74 61 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  taOff;          
1f6a0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
1f6b0 20 64 61 74 61 20 69 6e 20 66 69 6c 65 20 28 69   data in file (i
1f6c0 66 20 61 44 61 74 61 3d 3d 30 29 20 2a 2f 0a 20  f aData==0) */. 
1f6d0 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
1f6f0 64 73 2e 73 7a 43 6f 6d 70 72 65 73 73 65 64 20  ds.szCompressed 
1f700 62 79 74 65 73 20 6f 66 20 63 6f 6d 70 72 65 73  bytes of compres
1f710 73 65 64 20 64 61 74 61 20 2a 2f 0a 20 20 5a 69  sed data */.  Zi
1f720 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65 78  pfileEntry *pNex
1f730 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
1f740 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 6e 2d 6d   element in in-m
1f750 65 6d 6f 72 79 20 43 44 53 20 2a 2f 0a 7d 3b 0a  emory CDS */.};.
1f760 0a 2f 2a 20 0a 2a 2a 20 43 75 72 73 6f 72 20 74  ./* .** Cursor t
1f770 79 70 65 20 66 6f 72 20 7a 69 70 66 69 6c 65 20  ype for zipfile 
1f780 74 61 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64  tables..*/.typed
1f790 65 66 20 73 74 72 75 63 74 20 5a 69 70 66 69 6c  ef struct Zipfil
1f7a0 65 43 73 72 20 5a 69 70 66 69 6c 65 43 73 72 3b  eCsr ZipfileCsr;
1f7b0 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65 43  .struct ZipfileC
1f7c0 73 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  sr {.  sqlite3_v
1f7d0 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
1f7e0 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
1f7f0 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  - must be first 
1f800 2a 2f 0a 20 20 69 36 34 20 69 49 64 3b 20 20 20  */.  i64 iId;   
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 2f 2a 20 43 75 72 73 6f 72 20 49 44 20 2a 2f 0a  /* Cursor ID */.
1f830 20 20 75 38 20 62 45 6f 66 3b 20 20 20 20 20 20    u8 bEof;      
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f850 54 72 75 65 20 77 68 65 6e 20 61 74 20 45 4f 46  True when at EOF
1f860 20 2a 2f 0a 20 20 75 38 20 62 4e 6f 6f 70 3b 20   */.  u8 bNoop; 
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 2f 2a 20 49 66 20 6e 65 78 74 20 78 4e 65 78   /* If next xNex
1f890 74 28 29 20 63 61 6c 6c 20 69 73 20 6e 6f 2d 6f  t() call is no-o
1f8a0 70 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64 20  p */..  /* Used 
1f8b0 6f 75 74 73 69 64 65 20 6f 66 20 77 72 69 74 65  outside of write
1f8c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 2a 2f   transactions */
1f8d0 0a 20 20 46 49 4c 45 20 2a 70 46 69 6c 65 3b 20  .  FILE *pFile; 
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f8f0 20 5a 69 70 20 66 69 6c 65 20 2a 2f 0a 20 20 69   Zip file */.  i
1f900 36 34 20 69 4e 65 78 74 4f 66 66 3b 20 20 20 20  64 iNextOff;    
1f910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1f920 73 65 74 20 6f 66 20 6e 65 78 74 20 72 65 63 6f  set of next reco
1f930 72 64 20 69 6e 20 63 65 6e 74 72 61 6c 20 64 69  rd in central di
1f940 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 5a 69 70  rectory */.  Zip
1f950 66 69 6c 65 45 4f 43 44 20 65 6f 63 64 3b 20 20  fileEOCD eocd;  
1f960 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
1f970 20 6f 66 20 63 65 6e 74 72 61 6c 20 64 69 72 65   of central dire
1f980 63 74 6f 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  ctory record */.
1f990 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20  .  ZipfileEntry 
1f9a0 2a 70 46 72 65 65 45 6e 74 72 79 3b 20 20 2f 2a  *pFreeEntry;  /*
1f9b0 20 46 72 65 65 20 74 68 69 73 20 6c 69 73 74 20   Free this list 
1f9c0 77 68 65 6e 20 63 75 72 73 6f 72 20 69 73 20 63  when cursor is c
1f9d0 6c 6f 73 65 64 20 6f 72 20 72 65 73 65 74 20 2a  losed or reset *
1f9e0 2f 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79  /.  ZipfileEntry
1f9f0 20 2a 70 43 75 72 72 65 6e 74 3b 20 20 20 20 2f   *pCurrent;    /
1fa00 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20  * Current entry 
1fa10 2a 2f 0a 20 20 5a 69 70 66 69 6c 65 43 73 72 20  */.  ZipfileCsr 
1fa20 2a 70 43 73 72 4e 65 78 74 3b 20 20 20 20 20 20  *pCsrNext;      
1fa30 2f 2a 20 4e 65 78 74 20 63 75 72 73 6f 72 20 6f  /* Next cursor o
1fa40 6e 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74  n same virtual t
1fa50 61 62 6c 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65  able */.};..type
1fa60 64 65 66 20 73 74 72 75 63 74 20 5a 69 70 66 69  def struct Zipfi
1fa70 6c 65 54 61 62 20 5a 69 70 66 69 6c 65 54 61 62  leTab ZipfileTab
1fa80 3b 0a 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65  ;.struct Zipfile
1fa90 54 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Tab {.  sqlite3_
1faa0 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20 20  vtab base;      
1fab0 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
1fac0 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74   - must be first
1fad0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
1fae0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1faf0 20 2f 2a 20 5a 69 70 20 66 69 6c 65 20 74 68 69   /* Zip file thi
1fb00 73 20 74 61 62 6c 65 20 61 63 63 65 73 73 65 73  s table accesses
1fb10 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
1fb20 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb40 2a 20 48 6f 73 74 20 64 61 74 61 62 61 73 65 20  * Host database 
1fb50 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1fb60 75 38 20 2a 61 42 75 66 66 65 72 3b 20 20 20 20  u8 *aBuffer;    
1fb70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1fb80 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 75  mporary buffer u
1fb90 73 65 64 20 66 6f 72 20 76 61 72 69 6f 75 73 20  sed for various 
1fba0 74 61 73 6b 73 20 2a 2f 0a 0a 20 20 5a 69 70 66  tasks */..  Zipf
1fbb0 69 6c 65 43 73 72 20 2a 70 43 73 72 4c 69 73 74  ileCsr *pCsrList
1fbc0 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
1fbd0 66 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 69  f cursors */.  i
1fbe0 36 34 20 69 4e 65 78 74 43 73 72 69 64 3b 0a 0a  64 iNextCsrid;..
1fbf0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1fc00 6e 67 20 61 72 65 20 75 73 65 64 20 62 79 20 77  ng are used by w
1fc10 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1fc20 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 5a 69 70 66  s only */.  Zipf
1fc30 69 6c 65 45 6e 74 72 79 20 2a 70 46 69 72 73 74  ileEntry *pFirst
1fc40 45 6e 74 72 79 3b 20 2f 2a 20 4c 69 6e 6b 65 64  Entry; /* Linked
1fc50 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 66 69 6c   list of all fil
1fc60 65 73 20 28 69 66 20 70 57 72 69 74 65 46 64 21  es (if pWriteFd!
1fc70 3d 30 29 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65  =0) */.  Zipfile
1fc80 45 6e 74 72 79 20 2a 70 4c 61 73 74 45 6e 74 72  Entry *pLastEntr
1fc90 79 3b 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  y;  /* Last elem
1fca0 65 6e 74 20 69 6e 20 70 46 69 72 73 74 45 6e 74  ent in pFirstEnt
1fcb0 72 79 20 6c 69 73 74 20 2a 2f 0a 20 20 46 49 4c  ry list */.  FIL
1fcc0 45 20 2a 70 57 72 69 74 65 46 64 3b 20 20 20 20  E *pWriteFd;    
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1fce0 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 7a  handle open on z
1fcf0 69 70 20 61 72 63 68 69 76 65 20 2a 2f 0a 20 20  ip archive */.  
1fd00 69 36 34 20 73 7a 43 75 72 72 65 6e 74 3b 20 20  i64 szCurrent;  
1fd10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1fd20 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 7a 69  rrent size of zi
1fd30 70 20 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 69  p archive */.  i
1fd40 36 34 20 73 7a 4f 72 69 67 3b 20 20 20 20 20 20  64 szOrig;      
1fd50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1fd60 65 20 6f 66 20 61 72 63 68 69 76 65 20 61 74 20  e of archive at 
1fd70 73 74 61 72 74 20 6f 66 20 74 72 61 6e 73 61 63  start of transac
1fd80 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  tion */.};../*.*
1fd90 2a 20 53 65 74 20 74 68 65 20 65 72 72 6f 72 20  * Set the error 
1fda0 6d 65 73 73 61 67 65 20 63 6f 6e 74 61 69 6e 65  message containe
1fdb0 64 20 69 6e 20 63 6f 6e 74 65 78 74 20 63 74 78  d in context ctx
1fdc0 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 73 20   to the results 
1fdd0 6f 66 0a 2a 2a 20 76 70 72 69 6e 74 66 28 7a 46  of.** vprintf(zF
1fde0 6d 74 2c 20 2e 2e 2e 29 2e 0a 2a 2f 0a 73 74 61  mt, ...)..*/.sta
1fdf0 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
1fe00 43 74 78 45 72 72 6f 72 4d 73 67 28 73 71 6c 69  CtxErrorMsg(sqli
1fe10 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
1fe20 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1fe30 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72  mt, ...){.  char
1fe40 20 2a 7a 4d 73 67 20 3d 20 30 3b 0a 20 20 76 61   *zMsg = 0;.  va
1fe50 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
1fe60 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
1fe70 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1fe80 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
1fe90 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  ap);.  sqlite3_r
1fea0 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c  esult_error(ctx,
1feb0 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 73 71   zMsg, -1);.  sq
1fec0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
1fed0 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
1fee0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 73 74 72 69  }../*.** If stri
1fef0 6e 67 20 7a 49 6e 20 69 73 20 71 75 6f 74 65 64  ng zIn is quoted
1ff00 2c 20 64 65 71 75 6f 74 65 20 69 74 20 69 6e 20  , dequote it in 
1ff10 70 6c 61 63 65 2e 20 4f 74 68 65 72 77 69 73 65  place. Otherwise
1ff20 2c 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 0a  , if the string.
1ff30 2a 2a 20 69 73 20 6e 6f 74 20 71 75 6f 74 65 64  ** is not quoted
1ff40 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  , do nothing..*/
1ff50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70  .static void zip
1ff60 66 69 6c 65 44 65 71 75 6f 74 65 28 63 68 61 72  fileDequote(char
1ff70 20 2a 7a 49 6e 29 7b 0a 20 20 63 68 61 72 20 71   *zIn){.  char q
1ff80 20 3d 20 7a 49 6e 5b 30 5d 3b 0a 20 20 69 66 28   = zIn[0];.  if(
1ff90 20 71 3d 3d 27 22 27 20 7c 7c 20 71 3d 3d 27 5c   q=='"' || q=='\
1ffa0 27 27 20 7c 7c 20 71 3d 3d 27 60 27 20 7c 7c 20  '' || q=='`' || 
1ffb0 71 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 69 6e  q=='[' ){.    in
1ffc0 74 20 69 49 6e 20 3d 20 31 3b 0a 20 20 20 20 69  t iIn = 1;.    i
1ffd0 6e 74 20 69 4f 75 74 20 3d 20 30 3b 0a 20 20 20  nt iOut = 0;.   
1ffe0 20 69 66 28 20 71 3d 3d 27 5b 27 20 29 20 71 20   if( q=='[' ) q 
1fff0 3d 20 27 5d 27 3b 0a 20 20 20 20 77 68 69 6c 65  = ']';.    while
20000 28 20 41 4c 57 41 59 53 28 7a 49 6e 5b 69 49 6e  ( ALWAYS(zIn[iIn
20010 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ]) ){.      char
20020 20 63 20 3d 20 7a 49 6e 5b 69 49 6e 2b 2b 5d 3b   c = zIn[iIn++];
20030 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 71 20  .      if( c==q 
20040 26 26 20 7a 49 6e 5b 69 49 6e 2b 2b 5d 21 3d 71  && zIn[iIn++]!=q
20050 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
20060 7a 49 6e 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  zIn[iOut++] = c;
20070 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e 5b 69  .    }.    zIn[i
20080 4f 75 74 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  Out] = '\0';.  }
20090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
200a0 75 63 74 20 61 20 6e 65 77 20 5a 69 70 66 69 6c  uct a new Zipfil
200b0 65 54 61 62 20 76 69 72 74 75 61 6c 20 74 61 62  eTab virtual tab
200c0 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 0a 2a  le object..** .*
200d0 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e  *   argv[0]   ->
200e0 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22   module name  ("
200f0 7a 69 70 66 69 6c 65 22 29 0a 2a 2a 20 20 20 61  zipfile").**   a
20100 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61  rgv[1]   -> data
20110 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61  base name.**   a
20120 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c  rgv[2]   -> tabl
20130 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
20140 5b 2e 2e 2e 5d 20 2d 3e 20 22 63 6f 6c 75 6d 6e  [...] -> "column
20150 20 6e 61 6d 65 22 20 61 6e 64 20 6f 74 68 65 72   name" and other
20160 20 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74   module argument
20170 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 61 74   fields..*/.stat
20180 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 43 6f  ic int zipfileCo
20190 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  nnect(.  sqlite3
201a0 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41   *db,.  void *pA
201b0 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  ux,.  int argc, 
201c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
201d0 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  t*argv,.  sqlite
201e0 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c  3_vtab **ppVtab,
201f0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
20200 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
20210 20 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65 54   sizeof(ZipfileT
20220 61 62 29 20 2b 20 5a 49 50 46 49 4c 45 5f 42 55  ab) + ZIPFILE_BU
20230 46 46 45 52 5f 53 49 5a 45 3b 0a 20 20 69 6e 74  FFER_SIZE;.  int
20240 20 6e 46 69 6c 65 20 3d 20 30 3b 0a 20 20 63 6f   nFile = 0;.  co
20250 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
20260 3d 20 30 3b 0a 20 20 5a 69 70 66 69 6c 65 54 61  = 0;.  ZipfileTa
20270 62 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69  b *pNew = 0;.  i
20280 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  nt rc;..  /* If 
20290 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
202a0 73 20 6e 6f 74 20 22 7a 69 70 66 69 6c 65 22 2c  s not "zipfile",
202b0 20 72 65 71 75 69 72 65 20 74 68 61 74 20 74 68   require that th
202c0 65 20 61 72 67 75 6d 65 6e 74 20 62 65 0a 20 20  e argument be.  
202d0 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 20 54 68  ** specified. Th
202e0 69 73 20 73 74 6f 70 73 20 7a 69 70 66 69 6c 65  is stops zipfile
202f0 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 62 65 69   tables from bei
20300 6e 67 20 63 72 65 61 74 65 64 20 61 73 3a 0a 20  ng created as:. 
20310 20 2a 2a 0a 20 20 2a 2a 20 20 20 43 52 45 41 54   **.  **   CREAT
20320 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
20330 7a 7a 7a 20 55 53 49 4e 47 20 7a 69 70 66 69 6c  zzz USING zipfil
20340 65 28 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  e();.  **.  ** I
20350 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76 65  t does not preve
20360 6e 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nt:.  **.  **   
20370 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
20380 41 42 4c 45 20 7a 69 70 66 69 6c 65 20 55 53 49  ABLE zipfile USI
20390 4e 47 20 7a 69 70 66 69 6c 65 28 29 3b 0a 20 20  NG zipfile();.  
203a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
203b0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
203c0 61 72 67 76 5b 30 5d 2c 20 22 7a 69 70 66 69 6c  argv[0], "zipfil
203d0 65 22 29 20 29 3b 0a 20 20 69 66 28 20 28 30 21  e") );.  if( (0!
203e0 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70  =sqlite3_stricmp
203f0 28 61 72 67 76 5b 32 5d 2c 20 22 7a 69 70 66 69  (argv[2], "zipfi
20400 6c 65 22 29 20 26 26 20 61 72 67 63 3c 34 29 20  le") && argc<4) 
20410 7c 7c 20 61 72 67 63 3e 34 20 29 7b 0a 20 20 20  || argc>4 ){.   
20420 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65   *pzErr = sqlite
20430 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66 69  3_mprintf("zipfi
20440 6c 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 72  le constructor r
20450 65 71 75 69 72 65 73 20 6f 6e 65 20 61 72 67 75  equires one argu
20460 6d 65 6e 74 22 29 3b 0a 20 20 20 20 72 65 74 75  ment");.    retu
20470 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
20480 0a 20 20 7d 0a 0a 20 20 69 66 28 20 61 72 67 63  .  }..  if( argc
20490 3e 33 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65 20  >3 ){.    zFile 
204a0 3d 20 61 72 67 76 5b 33 5d 3b 0a 20 20 20 20 6e  = argv[3];.    n
204b0 46 69 6c 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  File = (int)strl
204c0 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 7d  en(zFile)+1;.  }
204d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
204e0 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
204f0 2c 20 5a 49 50 46 49 4c 45 5f 53 43 48 45 4d 41  , ZIPFILE_SCHEMA
20500 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e  ITE_OK ){.    pN
20520 65 77 20 3d 20 28 5a 69 70 66 69 6c 65 54 61 62  ew = (ZipfileTab
20530 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
20540 36 34 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  64((sqlite3_int6
20550 34 29 6e 42 79 74 65 2b 6e 46 69 6c 65 29 3b 0a  4)nByte+nFile);.
20560 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
20570 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
20580 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65  NOMEM;.    memse
20590 74 28 70 4e 65 77 2c 20 30 2c 20 6e 42 79 74 65  t(pNew, 0, nByte
205a0 2b 6e 46 69 6c 65 29 3b 0a 20 20 20 20 70 4e 65  +nFile);.    pNe
205b0 77 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  w->db = db;.    
205c0 70 4e 65 77 2d 3e 61 42 75 66 66 65 72 20 3d 20  pNew->aBuffer = 
205d0 28 75 38 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  (u8*)&pNew[1];. 
205e0 20 20 20 69 66 28 20 7a 46 69 6c 65 20 29 7b 0a     if( zFile ){.
205f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 46 69 6c        pNew->zFil
20600 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
20610 2d 3e 61 42 75 66 66 65 72 5b 5a 49 50 46 49 4c  ->aBuffer[ZIPFIL
20620 45 5f 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a  E_BUFFER_SIZE];.
20630 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65        memcpy(pNe
20640 77 2d 3e 7a 46 69 6c 65 2c 20 7a 46 69 6c 65 2c  w->zFile, zFile,
20650 20 6e 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7a   nFile);.      z
20660 69 70 66 69 6c 65 44 65 71 75 6f 74 65 28 70 4e  ipfileDequote(pN
20670 65 77 2d 3e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ew->zFile);.    
20680 7d 0a 20 20 7d 0a 20 20 2a 70 70 56 74 61 62 20  }.  }.  *ppVtab 
20690 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62 2a  = (sqlite3_vtab*
206a0 29 70 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20  )pNew;.  return 
206b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
206c0 65 20 74 68 65 20 5a 69 70 66 69 6c 65 45 6e 74  e the ZipfileEnt
206d0 72 79 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  ry structure ind
206e0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 6f 6e  icated by the on
206f0 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
20700 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66  static void zipf
20710 69 6c 65 45 6e 74 72 79 46 72 65 65 28 5a 69 70  ileEntryFree(Zip
20720 66 69 6c 65 45 6e 74 72 79 20 2a 70 29 7b 0a 20  fileEntry *p){. 
20730 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
20740 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 63 64  lite3_free(p->cd
20750 73 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20 73 71  s.zFile);.    sq
20760 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
20770 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65   }.}../*.** Rele
20780 61 73 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  ase resources th
20790 61 74 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  at should be fre
207a0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
207b0 20 61 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61   a write .** tra
207c0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
207d0 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
207e0 43 6c 65 61 6e 75 70 54 72 61 6e 73 61 63 74 69  CleanupTransacti
207f0 6f 6e 28 5a 69 70 66 69 6c 65 54 61 62 20 2a 70  on(ZipfileTab *p
20800 54 61 62 29 7b 0a 20 20 5a 69 70 66 69 6c 65 45  Tab){.  ZipfileE
20810 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20  ntry *pEntry;.  
20820 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e  ZipfileEntry *pN
20830 65 78 74 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ext;..  if( pTab
20840 2d 3e 70 57 72 69 74 65 46 64 20 29 7b 0a 20 20  ->pWriteFd ){.  
20850 20 20 66 63 6c 6f 73 65 28 70 54 61 62 2d 3e 70    fclose(pTab->p
20860 57 72 69 74 65 46 64 29 3b 0a 20 20 20 20 70 54  WriteFd);.    pT
20870 61 62 2d 3e 70 57 72 69 74 65 46 64 20 3d 20 30  ab->pWriteFd = 0
20880 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 45 6e 74  ;.  }.  for(pEnt
20890 72 79 3d 70 54 61 62 2d 3e 70 46 69 72 73 74 45  ry=pTab->pFirstE
208a0 6e 74 72 79 3b 20 70 45 6e 74 72 79 3b 20 70 45  ntry; pEntry; pE
208b0 6e 74 72 79 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ntry=pNext){.   
208c0 20 70 4e 65 78 74 20 3d 20 70 45 6e 74 72 79 2d   pNext = pEntry-
208d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7a 69 70 66  >pNext;.    zipf
208e0 69 6c 65 45 6e 74 72 79 46 72 65 65 28 70 45 6e  ileEntryFree(pEn
208f0 74 72 79 29 3b 0a 20 20 7d 0a 20 20 70 54 61 62  try);.  }.  pTab
20900 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 20 3d 20  ->pFirstEntry = 
20910 30 3b 0a 20 20 70 54 61 62 2d 3e 70 4c 61 73 74  0;.  pTab->pLast
20920 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20 70 54 61  Entry = 0;.  pTa
20930 62 2d 3e 73 7a 43 75 72 72 65 6e 74 20 3d 20 30  b->szCurrent = 0
20940 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 4f 72 69 67  ;.  pTab->szOrig
20950 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
20960 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20 74 68  his method is th
20970 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
20980 20 7a 69 70 66 69 6c 65 20 76 74 61 62 20 6f 62   zipfile vtab ob
20990 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  jects..*/.static
209a0 20 69 6e 74 20 7a 69 70 66 69 6c 65 44 69 73 63   int zipfileDisc
209b0 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
209c0 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 7a  tab *pVtab){.  z
209d0 69 70 66 69 6c 65 43 6c 65 61 6e 75 70 54 72 61  ipfileCleanupTra
209e0 6e 73 61 63 74 69 6f 6e 28 28 5a 69 70 66 69 6c  nsaction((Zipfil
209f0 65 54 61 62 2a 29 70 56 74 61 62 29 3b 0a 20 20  eTab*)pVtab);.  
20a00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
20a10 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
20a20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20a30 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f  * Constructor fo
20a40 72 20 61 20 6e 65 77 20 5a 69 70 66 69 6c 65 43  r a new ZipfileC
20a50 73 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  sr object..*/.st
20a60 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
20a70 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
20a80 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  b *p, sqlite3_vt
20a90 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 73  ab_cursor **ppCs
20aa0 72 29 7b 0a 20 20 5a 69 70 66 69 6c 65 54 61 62  r){.  ZipfileTab
20ab0 20 2a 70 54 61 62 20 3d 20 28 5a 69 70 66 69 6c   *pTab = (Zipfil
20ac0 65 54 61 62 2a 29 70 3b 0a 20 20 5a 69 70 66 69  eTab*)p;.  Zipfi
20ad0 6c 65 43 73 72 20 2a 70 43 73 72 3b 0a 20 20 70  leCsr *pCsr;.  p
20ae0 43 73 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Csr = sqlite3_ma
20af0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 43 73  lloc(sizeof(*pCs
20b00 72 29 29 3b 0a 20 20 2a 70 70 43 73 72 20 3d 20  r));.  *ppCsr = 
20b10 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
20b20 72 73 6f 72 2a 29 70 43 73 72 3b 0a 20 20 69 66  rsor*)pCsr;.  if
20b30 28 20 70 43 73 72 3d 3d 30 20 29 7b 0a 20 20 20  ( pCsr==0 ){.   
20b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20b50 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  OMEM;.  }.  mems
20b60 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a 65  et(pCsr, 0, size
20b70 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 70 43  of(*pCsr));.  pC
20b80 73 72 2d 3e 69 49 64 20 3d 20 2b 2b 70 54 61 62  sr->iId = ++pTab
20b90 2d 3e 69 4e 65 78 74 43 73 72 69 64 3b 0a 20 20  ->iNextCsrid;.  
20ba0 70 43 73 72 2d 3e 70 43 73 72 4e 65 78 74 20 3d  pCsr->pCsrNext =
20bb0 20 70 54 61 62 2d 3e 70 43 73 72 4c 69 73 74 3b   pTab->pCsrList;
20bc0 0a 20 20 70 54 61 62 2d 3e 70 43 73 72 4c 69 73  .  pTab->pCsrLis
20bd0 74 20 3d 20 70 43 73 72 3b 0a 20 20 72 65 74 75  t = pCsr;.  retu
20be0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20bf0 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 63  ./*.** Reset a c
20c00 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 74 68  ursor back to th
20c10 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
20c20 6e 20 77 68 65 6e 20 66 69 72 73 74 20 72 65 74  n when first ret
20c30 75 72 6e 65 64 0a 2a 2a 20 62 79 20 7a 69 70 66  urned.** by zipf
20c40 69 6c 65 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 73 74  ileOpen()..*/.st
20c50 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c  atic void zipfil
20c60 65 52 65 73 65 74 43 75 72 73 6f 72 28 5a 69 70  eResetCursor(Zip
20c70 66 69 6c 65 43 73 72 20 2a 70 43 73 72 29 7b 0a  fileCsr *pCsr){.
20c80 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a    ZipfileEntry *
20c90 70 3b 0a 20 20 5a 69 70 66 69 6c 65 45 6e 74 72  p;.  ZipfileEntr
20ca0 79 20 2a 70 4e 65 78 74 3b 0a 0a 20 20 70 43 73  y *pNext;..  pCs
20cb0 72 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 69  r->bEof = 0;.  i
20cc0 66 28 20 70 43 73 72 2d 3e 70 46 69 6c 65 20 29  f( pCsr->pFile )
20cd0 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 70 43 73  {.    fclose(pCs
20ce0 72 2d 3e 70 46 69 6c 65 29 3b 0a 20 20 20 20 70  r->pFile);.    p
20cf0 43 73 72 2d 3e 70 46 69 6c 65 20 3d 20 30 3b 0a  Csr->pFile = 0;.
20d00 20 20 20 20 7a 69 70 66 69 6c 65 45 6e 74 72 79      zipfileEntry
20d10 46 72 65 65 28 70 43 73 72 2d 3e 70 43 75 72 72  Free(pCsr->pCurr
20d20 65 6e 74 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  ent);.    pCsr->
20d30 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20  pCurrent = 0;.  
20d40 7d 0a 0a 20 20 66 6f 72 28 70 3d 70 43 73 72 2d  }..  for(p=pCsr-
20d50 3e 70 46 72 65 65 45 6e 74 72 79 3b 20 70 3b 20  >pFreeEntry; p; 
20d60 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
20d70 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
20d80 20 20 20 20 7a 69 70 66 69 6c 65 45 6e 74 72 79      zipfileEntry
20d90 46 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  Free(p);.  }.}..
20da0 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72  /*.** Destructor
20db0 20 66 6f 72 20 61 6e 20 5a 69 70 66 69 6c 65 43   for an ZipfileC
20dc0 73 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sr..*/.static in
20dd0 74 20 7a 69 70 66 69 6c 65 43 6c 6f 73 65 28 73  t zipfileClose(s
20de0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
20df0 6f 72 20 2a 63 75 72 29 7b 0a 20 20 5a 69 70 66  or *cur){.  Zipf
20e00 69 6c 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28  ileCsr *pCsr = (
20e10 5a 69 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b  ZipfileCsr*)cur;
20e20 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70  .  ZipfileTab *p
20e30 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61  Tab = (ZipfileTa
20e40 62 2a 29 28 70 43 73 72 2d 3e 62 61 73 65 2e 70  b*)(pCsr->base.p
20e50 56 74 61 62 29 3b 0a 20 20 5a 69 70 66 69 6c 65  Vtab);.  Zipfile
20e60 43 73 72 20 2a 2a 70 70 3b 0a 20 20 7a 69 70 66  Csr **pp;.  zipf
20e70 69 6c 65 52 65 73 65 74 43 75 72 73 6f 72 28 70  ileResetCursor(p
20e80 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Csr);..  /* Remo
20e90 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 66  ve this cursor f
20ea0 72 6f 6d 20 74 68 65 20 5a 69 70 66 69 6c 65 54  rom the ZipfileT
20eb0 61 62 2e 70 43 73 72 4c 69 73 74 20 6c 69 73 74  ab.pCsrList list
20ec0 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 70 3d 26 70  . */.  for(pp=&p
20ed0 54 61 62 2d 3e 70 43 73 72 4c 69 73 74 3b 20 2a  Tab->pCsrList; *
20ee0 70 70 21 3d 70 43 73 72 3b 20 70 70 3d 26 28 28  pp!=pCsr; pp=&((
20ef0 2a 70 70 29 2d 3e 70 43 73 72 4e 65 78 74 29 29  *pp)->pCsrNext))
20f00 3b 0a 20 20 2a 70 70 20 3d 20 70 43 73 72 2d 3e  ;.  *pp = pCsr->
20f10 70 43 73 72 4e 65 78 74 3b 0a 0a 20 20 73 71 6c  pCsrNext;..  sql
20f20 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b  ite3_free(pCsr);
20f30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20f40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
20f50 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  t the error mess
20f60 61 67 65 20 66 6f 72 20 74 68 65 20 76 69 72 74  age for the virt
20f70 75 61 6c 20 74 61 62 6c 65 20 61 73 73 6f 63 69  ual table associ
20f80 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
20f90 0a 2a 2a 20 70 43 73 72 20 74 6f 20 74 68 65 20  .** pCsr to the 
20fa0 72 65 73 75 6c 74 73 20 6f 66 20 76 70 72 69 6e  results of vprin
20fb0 74 66 28 7a 46 6d 74 2c 20 2e 2e 2e 29 2e 0a 2a  tf(zFmt, ...)..*
20fc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69  /.static void zi
20fd0 70 66 69 6c 65 54 61 62 6c 65 45 72 72 28 5a 69  pfileTableErr(Zi
20fe0 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 2c 20  pfileTab *pTab, 
20ff0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
21000 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
21010 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74  t ap;.  va_start
21020 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 73 71  (ap, zFmt);.  sq
21030 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61 62 2d  lite3_free(pTab-
21040 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 29 3b 0a  >base.zErrMsg);.
21050 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
21060 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  rMsg = sqlite3_v
21070 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
21080 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
21090 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  .}.static void z
210a0 69 70 66 69 6c 65 43 75 72 73 6f 72 45 72 72 28  ipfileCursorErr(
210b0 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73 72  ZipfileCsr *pCsr
210c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
210d0 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  mt, ...){.  va_l
210e0 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
210f0 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
21100 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73  sqlite3_free(pCs
21110 72 2d 3e 62 61 73 65 2e 70 56 74 61 62 2d 3e 7a  r->base.pVtab->z
21120 45 72 72 4d 73 67 29 3b 0a 20 20 70 43 73 72 2d  ErrMsg);.  pCsr-
21130 3e 62 61 73 65 2e 70 56 74 61 62 2d 3e 7a 45 72  >base.pVtab->zEr
21140 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  rMsg = sqlite3_v
21150 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
21160 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
21170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 6e  .}../*.** Read n
21180 52 65 61 64 20 62 79 74 65 73 20 6f 66 20 64 61  Read bytes of da
21190 74 61 20 66 72 6f 6d 20 6f 66 66 73 65 74 20 69  ta from offset i
211a0 4f 66 66 20 6f 66 20 66 69 6c 65 20 70 46 69 6c  Off of file pFil
211b0 65 20 69 6e 74 6f 20 62 75 66 66 65 72 0a 2a 2a  e into buffer.**
211c0 20 61 52 65 61 64 5b 5d 2e 20 52 65 74 75 72 6e   aRead[]. Return
211d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
211e0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
211f0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
21200 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 20  e.** otherwise. 
21210 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
21220 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 6f  or does occur, o
21230 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28  utput variable (
21240 2a 70 7a 45 72 72 6d 73 67 29 20 6d 61 79 20 62  *pzErrmsg) may b
21250 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 0a 2a  e set to point.*
21260 2a 20 74 6f 20 61 6e 20 45 6e 67 6c 69 73 68 20  * to an English 
21270 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
21280 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
21290 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
212a0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
212b0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
212c0 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
212d0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
212e0 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
212f0 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 52  tic int zipfileR
21300 65 61 64 44 61 74 61 28 0a 20 20 46 49 4c 45 20  eadData(.  FILE 
21310 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
21320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21330 61 64 20 66 72 6f 6d 20 74 68 69 73 20 66 69 6c  ad from this fil
21340 65 20 2a 2f 0a 20 20 75 38 20 2a 61 52 65 61 64  e */.  u8 *aRead
21350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21360 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 69         /* Read i
21370 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
21380 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20  */.  int nRead, 
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
213b0 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
213c0 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20  */.  i64 iOff,  
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213e0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
213f0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
21400 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
21430 65 73 73 61 67 65 20 28 66 72 6f 6d 20 73 71 6c  essage (from sql
21440 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 2a 2f 0a  ite3_malloc) */.
21450 29 7b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20  ){.  size_t n;. 
21460 20 66 73 65 65 6b 28 70 46 69 6c 65 2c 20 28 6c   fseek(pFile, (l
21470 6f 6e 67 29 69 4f 66 66 2c 20 53 45 45 4b 5f 53  ong)iOff, SEEK_S
21480 45 54 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64  ET);.  n = fread
21490 28 61 52 65 61 64 2c 20 31 2c 20 6e 52 65 61 64  (aRead, 1, nRead
214a0 2c 20 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  , pFile);.  if( 
214b0 28 69 6e 74 29 6e 21 3d 6e 52 65 61 64 20 29 7b  (int)n!=nRead ){
214c0 0a 20 20 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d  .    *pzErrmsg =
214d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
214e0 28 22 65 72 72 6f 72 20 69 6e 20 66 72 65 61 64  ("error in fread
214f0 28 29 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()");.    return
21500 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
21510 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
21520 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
21530 20 69 6e 74 20 7a 69 70 66 69 6c 65 41 70 70 65   int zipfileAppe
21540 6e 64 44 61 74 61 28 0a 20 20 5a 69 70 66 69 6c  ndData(.  Zipfil
21550 65 54 61 62 20 2a 70 54 61 62 2c 0a 20 20 63 6f  eTab *pTab,.  co
21560 6e 73 74 20 75 38 20 2a 61 57 72 69 74 65 2c 0a  nst u8 *aWrite,.
21570 20 20 69 6e 74 20 6e 57 72 69 74 65 0a 29 7b 0a    int nWrite.){.
21580 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20 66 73    size_t n;.  fs
21590 65 65 6b 28 70 54 61 62 2d 3e 70 57 72 69 74 65  eek(pTab->pWrite
215a0 46 64 2c 20 28 6c 6f 6e 67 29 70 54 61 62 2d 3e  Fd, (long)pTab->
215b0 73 7a 43 75 72 72 65 6e 74 2c 20 53 45 45 4b 5f  szCurrent, SEEK_
215c0 53 45 54 29 3b 0a 20 20 6e 20 3d 20 66 77 72 69  SET);.  n = fwri
215d0 74 65 28 61 57 72 69 74 65 2c 20 31 2c 20 6e 57  te(aWrite, 1, nW
215e0 72 69 74 65 2c 20 70 54 61 62 2d 3e 70 57 72 69  rite, pTab->pWri
215f0 74 65 46 64 29 3b 0a 20 20 69 66 28 20 28 69 6e  teFd);.  if( (in
21600 74 29 6e 21 3d 6e 57 72 69 74 65 20 29 7b 0a 20  t)n!=nWrite ){. 
21610 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45     pTab->base.zE
21620 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
21630 6d 70 72 69 6e 74 66 28 22 65 72 72 6f 72 20 69  mprintf("error i
21640 6e 20 66 77 72 69 74 65 28 29 22 29 3b 0a 20 20  n fwrite()");.  
21650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21660 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 54 61  ERROR;.  }.  pTa
21670 62 2d 3e 73 7a 43 75 72 72 65 6e 74 20 2b 3d 20  b->szCurrent += 
21680 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
21690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
216a0 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65  *.** Read and re
216b0 74 75 72 6e 20 61 20 31 36 2d 62 69 74 20 6c 69  turn a 16-bit li
216c0 74 74 6c 65 2d 65 6e 64 69 61 6e 20 75 6e 73 69  ttle-endian unsi
216d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 72 6f  gned integer fro
216e0 6d 20 62 75 66 66 65 72 20 61 42 75 66 2e 0a 2a  m buffer aBuf..*
216f0 2f 0a 73 74 61 74 69 63 20 75 31 36 20 7a 69 70  /.static u16 zip
21700 66 69 6c 65 47 65 74 55 31 36 28 63 6f 6e 73 74  fileGetU16(const
21710 20 75 38 20 2a 61 42 75 66 29 7b 0a 20 20 72 65   u8 *aBuf){.  re
21720 74 75 72 6e 20 28 61 42 75 66 5b 31 5d 20 3c 3c  turn (aBuf[1] <<
21730 20 38 29 20 2b 20 61 42 75 66 5b 30 5d 3b 0a 7d   8) + aBuf[0];.}
21740 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64  ../*.** Read and
21750 20 72 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   return a 32-bit
21760 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 20 75   little-endian u
21770 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
21780 66 72 6f 6d 20 62 75 66 66 65 72 20 61 42 75 66  from buffer aBuf
21790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
217a0 7a 69 70 66 69 6c 65 47 65 74 55 33 32 28 63 6f  zipfileGetU32(co
217b0 6e 73 74 20 75 38 20 2a 61 42 75 66 29 7b 0a 20  nst u8 *aBuf){. 
217c0 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 28 61   return ((u32)(a
217d0 42 75 66 5b 33 5d 29 20 3c 3c 20 32 34 29 0a 20  Buf[3]) << 24). 
217e0 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 28 61        + ((u32)(a
217f0 42 75 66 5b 32 5d 29 20 3c 3c 20 31 36 29 0a 20  Buf[2]) << 16). 
21800 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 28 61        + ((u32)(a
21810 42 75 66 5b 31 5d 29 20 3c 3c 20 20 38 29 0a 20  Buf[1]) <<  8). 
21820 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 28 61        + ((u32)(a
21830 42 75 66 5b 30 5d 29 20 3c 3c 20 20 30 29 3b 0a  Buf[0]) <<  0);.
21840 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
21850 20 31 36 2d 62 69 74 20 6c 69 74 74 6c 65 20 65   16-bit little e
21860 6e 64 69 61 74 65 20 69 6e 74 65 67 65 72 20 69  ndiate integer i
21870 6e 74 6f 20 62 75 66 66 65 72 20 61 42 75 66 2e  nto buffer aBuf.
21880 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21890 7a 69 70 66 69 6c 65 50 75 74 55 31 36 28 75 38  zipfilePutU16(u8
218a0 20 2a 61 42 75 66 2c 20 75 31 36 20 76 61 6c 29   *aBuf, u16 val)
218b0 7b 0a 20 20 61 42 75 66 5b 30 5d 20 3d 20 76 61  {.  aBuf[0] = va
218c0 6c 20 26 20 30 78 46 46 3b 0a 20 20 61 42 75 66  l & 0xFF;.  aBuf
218d0 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [1] = (val>>8) &
218e0 20 30 78 46 46 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xFF;.}../*.** 
218f0 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 6c  Write a 32-bit l
21900 69 74 74 6c 65 20 65 6e 64 69 61 74 65 20 69 6e  ittle endiate in
21910 74 65 67 65 72 20 69 6e 74 6f 20 62 75 66 66 65  teger into buffe
21920 72 20 61 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r aBuf..*/.stati
21930 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65 50 75  c void zipfilePu
21940 74 55 33 32 28 75 38 20 2a 61 42 75 66 2c 20 75  tU32(u8 *aBuf, u
21950 33 32 20 76 61 6c 29 7b 0a 20 20 61 42 75 66 5b  32 val){.  aBuf[
21960 30 5d 20 3d 20 76 61 6c 20 26 20 30 78 46 46 3b  0] = val & 0xFF;
21970 0a 20 20 61 42 75 66 5b 31 5d 20 3d 20 28 76 61  .  aBuf[1] = (va
21980 6c 3e 3e 38 29 20 26 20 30 78 46 46 3b 0a 20 20  l>>8) & 0xFF;.  
21990 61 42 75 66 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e  aBuf[2] = (val>>
219a0 31 36 29 20 26 20 30 78 46 46 3b 0a 20 20 61 42  16) & 0xFF;.  aB
219b0 75 66 5b 33 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  uf[3] = (val>>24
219c0 29 20 26 20 30 78 46 46 3b 0a 7d 0a 0a 23 64 65  ) & 0xFF;.}..#de
219d0 66 69 6e 65 20 7a 69 70 66 69 6c 65 52 65 61 64  fine zipfileRead
219e0 33 32 28 61 42 75 66 29 20 28 20 61 42 75 66 2b  32(aBuf) ( aBuf+
219f0 3d 34 2c 20 7a 69 70 66 69 6c 65 47 65 74 55 33  =4, zipfileGetU3
21a00 32 28 61 42 75 66 2d 34 29 20 29 0a 23 64 65 66  2(aBuf-4) ).#def
21a10 69 6e 65 20 7a 69 70 66 69 6c 65 52 65 61 64 31  ine zipfileRead1
21a20 36 28 61 42 75 66 29 20 28 20 61 42 75 66 2b 3d  6(aBuf) ( aBuf+=
21a30 32 2c 20 7a 69 70 66 69 6c 65 47 65 74 55 31 36  2, zipfileGetU16
21a40 28 61 42 75 66 2d 32 29 20 29 0a 0a 23 64 65 66  (aBuf-2) )..#def
21a50 69 6e 65 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ine zipfileWrite
21a60 33 32 28 61 42 75 66 2c 76 61 6c 29 20 7b 20 7a  32(aBuf,val) { z
21a70 69 70 66 69 6c 65 50 75 74 55 33 32 28 61 42 75  ipfilePutU32(aBu
21a80 66 2c 76 61 6c 29 3b 20 61 42 75 66 2b 3d 34 3b  f,val); aBuf+=4;
21a90 20 7d 0a 23 64 65 66 69 6e 65 20 7a 69 70 66 69   }.#define zipfi
21aa0 6c 65 57 72 69 74 65 31 36 28 61 42 75 66 2c 76  leWrite16(aBuf,v
21ab0 61 6c 29 20 7b 20 7a 69 70 66 69 6c 65 50 75 74  al) { zipfilePut
21ac0 55 31 36 28 61 42 75 66 2c 76 61 6c 29 3b 20 61  U16(aBuf,val); a
21ad0 42 75 66 2b 3d 32 3b 20 7d 0a 0a 2f 2a 0a 2a 2a  Buf+=2; }../*.**
21ae0 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 73 20 75   Magic numbers u
21af0 73 65 64 20 74 6f 20 72 65 61 64 20 43 44 53 20  sed to read CDS 
21b00 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 23 64 65 66  records..*/.#def
21b10 69 6e 65 20 5a 49 50 46 49 4c 45 5f 43 44 53 5f  ine ZIPFILE_CDS_
21b20 4e 46 49 4c 45 5f 4f 46 46 20 20 20 20 20 20 20  NFILE_OFF       
21b30 20 32 38 0a 23 64 65 66 69 6e 65 20 5a 49 50 46   28.#define ZIPF
21b40 49 4c 45 5f 43 44 53 5f 53 5a 43 4f 4d 50 52 45  ILE_CDS_SZCOMPRE
21b50 53 53 45 44 5f 4f 46 46 20 32 30 0a 0a 2f 2a 0a  SSED_OFF 20../*.
21b60 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 43 44  ** Decode the CD
21b70 53 20 72 65 63 6f 72 64 20 69 6e 20 62 75 66 66  S record in buff
21b80 65 72 20 61 42 75 66 20 69 6e 74 6f 20 28 2a 70  er aBuf into (*p
21b90 43 44 53 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  CDS). Return SQL
21ba0 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20 69 66 20  ITE_ERROR.** if 
21bb0 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 6e 6f  the record is no
21bc0 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2c 20 6f  t well-formed, o
21bd0 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 74 68 65  r SQLITE_OK othe
21be0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
21bf0 20 69 6e 74 20 7a 69 70 66 69 6c 65 52 65 61 64   int zipfileRead
21c00 43 44 53 28 75 38 20 2a 61 42 75 66 2c 20 5a 69  CDS(u8 *aBuf, Zi
21c10 70 66 69 6c 65 43 44 53 20 2a 70 43 44 53 29 7b  pfileCDS *pCDS){
21c20 0a 20 20 75 38 20 2a 61 52 65 61 64 20 3d 20 61  .  u8 *aRead = a
21c30 42 75 66 3b 0a 20 20 75 33 32 20 73 69 67 20 3d  Buf;.  u32 sig =
21c40 20 7a 69 70 66 69 6c 65 52 65 61 64 33 32 28 61   zipfileRead32(a
21c50 52 65 61 64 29 3b 0a 20 20 69 6e 74 20 72 63 20  Read);.  int rc 
21c60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
21c70 66 28 20 73 69 67 21 3d 5a 49 50 46 49 4c 45 5f  f( sig!=ZIPFILE_
21c80 53 49 47 4e 41 54 55 52 45 5f 43 44 53 20 29 7b  SIGNATURE_CDS ){
21c90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21ca0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
21cb0 0a 20 20 20 20 70 43 44 53 2d 3e 69 56 65 72 73  .    pCDS->iVers
21cc0 69 6f 6e 4d 61 64 65 42 79 20 3d 20 7a 69 70 66  ionMadeBy = zipf
21cd0 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
21ce0 3b 0a 20 20 20 20 70 43 44 53 2d 3e 69 56 65 72  ;.    pCDS->iVer
21cf0 73 69 6f 6e 45 78 74 72 61 63 74 20 3d 20 7a 69  sionExtract = zi
21d00 70 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61  pfileRead16(aRea
21d10 64 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e 66 6c  d);.    pCDS->fl
21d20 61 67 73 20 3d 20 7a 69 70 66 69 6c 65 52 65 61  ags = zipfileRea
21d30 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20  d16(aRead);.    
21d40 70 43 44 53 2d 3e 69 43 6f 6d 70 72 65 73 73 69  pCDS->iCompressi
21d50 6f 6e 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  on = zipfileRead
21d60 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70  16(aRead);.    p
21d70 43 44 53 2d 3e 6d 54 69 6d 65 20 3d 20 7a 69 70  CDS->mTime = zip
21d80 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64  fileRead16(aRead
21d90 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e 6d 44 61  );.    pCDS->mDa
21da0 74 65 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  te = zipfileRead
21db0 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70  16(aRead);.    p
21dc0 43 44 53 2d 3e 63 72 63 33 32 20 3d 20 7a 69 70  CDS->crc32 = zip
21dd0 66 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64  fileRead32(aRead
21de0 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e 73 7a 43  );.    pCDS->szC
21df0 6f 6d 70 72 65 73 73 65 64 20 3d 20 7a 69 70 66  ompressed = zipf
21e00 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29  ileRead32(aRead)
21e10 3b 0a 20 20 20 20 70 43 44 53 2d 3e 73 7a 55 6e  ;.    pCDS->szUn
21e20 63 6f 6d 70 72 65 73 73 65 64 20 3d 20 7a 69 70  compressed = zip
21e30 66 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64  fileRead32(aRead
21e40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
21e50 52 65 61 64 3d 3d 26 61 42 75 66 5b 5a 49 50 46  Read==&aBuf[ZIPF
21e60 49 4c 45 5f 43 44 53 5f 4e 46 49 4c 45 5f 4f 46  ILE_CDS_NFILE_OF
21e70 46 5d 20 29 3b 0a 20 20 20 20 70 43 44 53 2d 3e  F] );.    pCDS->
21e80 6e 46 69 6c 65 20 3d 20 7a 69 70 66 69 6c 65 52  nFile = zipfileR
21e90 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20  ead16(aRead);.  
21ea0 20 20 70 43 44 53 2d 3e 6e 45 78 74 72 61 20 3d    pCDS->nExtra =
21eb0 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61   zipfileRead16(a
21ec0 52 65 61 64 29 3b 0a 20 20 20 20 70 43 44 53 2d  Read);.    pCDS-
21ed0 3e 6e 43 6f 6d 6d 65 6e 74 20 3d 20 7a 69 70 66  >nComment = zipf
21ee0 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
21ef0 3b 0a 20 20 20 20 70 43 44 53 2d 3e 69 44 69 73  ;.    pCDS->iDis
21f00 6b 53 74 61 72 74 20 3d 20 7a 69 70 66 69 6c 65  kStart = zipfile
21f10 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20  Read16(aRead);. 
21f20 20 20 20 70 43 44 53 2d 3e 69 49 6e 74 65 72 6e     pCDS->iIntern
21f30 61 6c 41 74 74 72 20 3d 20 7a 69 70 66 69 6c 65  alAttr = zipfile
21f40 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20  Read16(aRead);. 
21f50 20 20 20 70 43 44 53 2d 3e 69 45 78 74 65 72 6e     pCDS->iExtern
21f60 61 6c 41 74 74 72 20 3d 20 7a 69 70 66 69 6c 65  alAttr = zipfile
21f70 52 65 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20  Read32(aRead);. 
21f80 20 20 20 70 43 44 53 2d 3e 69 4f 66 66 73 65 74     pCDS->iOffset
21f90 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 33 32   = zipfileRead32
21fa0 28 61 52 65 61 64 29 3b 0a 20 20 20 20 61 73 73  (aRead);.    ass
21fb0 65 72 74 28 20 61 52 65 61 64 3d 3d 26 61 42 75  ert( aRead==&aBu
21fc0 66 5b 5a 49 50 46 49 4c 45 5f 43 44 53 5f 46 49  f[ZIPFILE_CDS_FI
21fd0 58 45 44 5f 53 5a 5d 20 29 3b 0a 20 20 7d 0a 0a  XED_SZ] );.  }..
21fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21ff0 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
22000 20 4c 46 48 20 72 65 63 6f 72 64 20 69 6e 20 62   LFH record in b
22010 75 66 66 65 72 20 61 42 75 66 20 69 6e 74 6f 20  uffer aBuf into 
22020 28 2a 70 4c 46 48 29 2e 20 52 65 74 75 72 6e 20  (*pLFH). Return 
22030 53 51 4c 49 54 45 5f 45 52 52 4f 52 0a 2a 2a 20  SQLITE_ERROR.** 
22040 69 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  if the record is
22050 20 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64   not well-formed
22060 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  , or SQLITE_OK o
22070 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
22080 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 52  tic int zipfileR
22090 65 61 64 4c 46 48 28 0a 20 20 75 38 20 2a 61 42  eadLFH(.  u8 *aB
220a0 75 66 66 65 72 2c 0a 20 20 5a 69 70 66 69 6c 65  uffer,.  Zipfile
220b0 4c 46 48 20 2a 70 4c 46 48 0a 29 7b 0a 20 20 75  LFH *pLFH.){.  u
220c0 38 20 2a 61 52 65 61 64 20 3d 20 61 42 75 66 66  8 *aRead = aBuff
220d0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
220e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 75 33 32  QLITE_OK;..  u32
220f0 20 73 69 67 20 3d 20 7a 69 70 66 69 6c 65 52 65   sig = zipfileRe
22100 61 64 33 32 28 61 52 65 61 64 29 3b 0a 20 20 69  ad32(aRead);.  i
22110 66 28 20 73 69 67 21 3d 5a 49 50 46 49 4c 45 5f  f( sig!=ZIPFILE_
22120 53 49 47 4e 41 54 55 52 45 5f 4c 46 48 20 29 7b  SIGNATURE_LFH ){
22130 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22140 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
22150 0a 20 20 20 20 70 4c 46 48 2d 3e 69 56 65 72 73  .    pLFH->iVers
22160 69 6f 6e 45 78 74 72 61 63 74 20 3d 20 7a 69 70  ionExtract = zip
22170 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64  fileRead16(aRead
22180 29 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 66 6c 61  );.    pLFH->fla
22190 67 73 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  gs = zipfileRead
221a0 31 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70  16(aRead);.    p
221b0 4c 46 48 2d 3e 69 43 6f 6d 70 72 65 73 73 69 6f  LFH->iCompressio
221c0 6e 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  n = zipfileRead1
221d0 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 4c  6(aRead);.    pL
221e0 46 48 2d 3e 6d 54 69 6d 65 20 3d 20 7a 69 70 66  FH->mTime = zipf
221f0 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64 29  ileRead16(aRead)
22200 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 6d 44 61 74  ;.    pLFH->mDat
22210 65 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  e = zipfileRead1
22220 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 4c  6(aRead);.    pL
22230 46 48 2d 3e 63 72 63 33 32 20 3d 20 7a 69 70 66  FH->crc32 = zipf
22240 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29  ileRead32(aRead)
22250 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 73 7a 43 6f  ;.    pLFH->szCo
22260 6d 70 72 65 73 73 65 64 20 3d 20 7a 69 70 66 69  mpressed = zipfi
22270 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29 3b  leRead32(aRead);
22280 0a 20 20 20 20 70 4c 46 48 2d 3e 73 7a 55 6e 63  .    pLFH->szUnc
22290 6f 6d 70 72 65 73 73 65 64 20 3d 20 7a 69 70 66  ompressed = zipf
222a0 69 6c 65 52 65 61 64 33 32 28 61 52 65 61 64 29  ileRead32(aRead)
222b0 3b 0a 20 20 20 20 70 4c 46 48 2d 3e 6e 46 69 6c  ;.    pLFH->nFil
222c0 65 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31  e = zipfileRead1
222d0 36 28 61 52 65 61 64 29 3b 0a 20 20 20 20 70 4c  6(aRead);.    pL
222e0 46 48 2d 3e 6e 45 78 74 72 61 20 3d 20 7a 69 70  FH->nExtra = zip
222f0 66 69 6c 65 52 65 61 64 31 36 28 61 52 65 61 64  fileRead16(aRead
22300 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22310 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 42 75  rc;.}.../*.** Bu
22320 66 66 65 72 20 61 45 78 74 72 61 20 28 73 69 7a  ffer aExtra (siz
22330 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 29 20  e nExtra bytes) 
22340 63 6f 6e 74 61 69 6e 73 20 7a 69 70 20 61 72 63  contains zip arc
22350 68 69 76 65 20 22 65 78 74 72 61 22 20 66 69 65  hive "extra" fie
22360 6c 64 73 2e 0a 2a 2a 20 53 63 61 6e 20 74 68 72  lds..** Scan thr
22370 6f 75 67 68 20 74 68 69 73 20 62 75 66 66 65 72  ough this buffer
22380 20 74 6f 20 66 69 6e 64 20 61 6e 20 22 65 78 74   to find an "ext
22390 72 61 2d 74 69 6d 65 73 74 61 6d 70 22 20 66 69  ra-timestamp" fi
223a0 65 6c 64 2e 20 49 66 20 6f 6e 65 0a 2a 2a 20 65  eld. If one.** e
223b0 78 69 73 74 73 2c 20 65 78 74 72 61 63 74 20 74  xists, extract t
223c0 68 65 20 33 32 2d 62 69 74 20 6d 6f 64 69 66 69  he 32-bit modifi
223d0 63 61 74 69 6f 6e 2d 74 69 6d 65 73 74 61 6d 70  cation-timestamp
223e0 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 73 74 6f   from it and sto
223f0 72 65 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  re.** the value 
22400 69 6e 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  in output parame
22410 74 65 72 20 2a 70 6d 54 69 6d 65 2e 0a 2a 2a 0a  ter *pmTime..**.
22420 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
22430 6e 65 64 20 69 66 20 6e 6f 20 65 78 74 72 61 2d  ned if no extra-
22440 74 69 6d 65 73 74 61 6d 70 20 72 65 63 6f 72 64  timestamp record
22450 20 63 6f 75 6c 64 20 62 65 20 66 6f 75 6e 64 20   could be found 
22460 28 61 6e 64 20 73 6f 0a 2a 2a 20 2a 70 6d 54 69  (and so.** *pmTi
22470 6d 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  me is left uncha
22480 6e 67 65 64 29 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  nged), or non-ze
22490 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  ro otherwise..**
224a0 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 6c 20  .** The general 
224b0 66 6f 72 6d 61 74 20 6f 66 20 61 6e 20 65 78 74  format of an ext
224c0 72 61 20 66 69 65 6c 64 20 69 73 3a 0a 2a 2a 0a  ra field is:.**.
224d0 2a 2a 20 20 20 48 65 61 64 65 72 20 49 44 20 20  **   Header ID  
224e0 20 20 32 20 62 79 74 65 73 0a 2a 2a 20 20 20 44    2 bytes.**   D
224f0 61 74 61 20 53 69 7a 65 20 20 20 20 32 20 62 79  ata Size    2 by
22500 74 65 73 0a 2a 2a 20 20 20 44 61 74 61 20 20 20  tes.**   Data   
22510 20 20 20 20 20 20 4e 20 62 79 74 65 73 0a 2a 2f        N bytes.*/
22520 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66  .static int zipf
22530 69 6c 65 53 63 61 6e 45 78 74 72 61 28 75 38 20  ileScanExtra(u8 
22540 2a 61 45 78 74 72 61 2c 20 69 6e 74 20 6e 45 78  *aExtra, int nEx
22550 74 72 61 2c 20 75 33 32 20 2a 70 6d 54 69 6d 65  tra, u32 *pmTime
22560 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  ){.  int ret = 0
22570 3b 0a 20 20 75 38 20 2a 70 20 3d 20 61 45 78 74  ;.  u8 *p = aExt
22580 72 61 3b 0a 20 20 75 38 20 2a 70 45 6e 64 20 3d  ra;.  u8 *pEnd =
22590 20 26 61 45 78 74 72 61 5b 6e 45 78 74 72 61 5d   &aExtra[nExtra]
225a0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45  ;..  while( p<pE
225b0 6e 64 20 29 7b 0a 20 20 20 20 75 31 36 20 69 64  nd ){.    u16 id
225c0 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36   = zipfileRead16
225d0 28 70 29 3b 0a 20 20 20 20 75 31 36 20 6e 42 79  (p);.    u16 nBy
225e0 74 65 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  te = zipfileRead
225f0 31 36 28 70 29 3b 0a 0a 20 20 20 20 73 77 69 74  16(p);..    swit
22600 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 20 20  ch( id ){.      
22610 63 61 73 65 20 5a 49 50 46 49 4c 45 5f 45 58 54  case ZIPFILE_EXT
22620 52 41 5f 54 49 4d 45 53 54 41 4d 50 3a 20 7b 0a  RA_TIMESTAMP: {.
22630 20 20 20 20 20 20 20 20 75 38 20 62 20 3d 20 70          u8 b = p
22640 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
22650 20 62 20 26 20 30 78 30 31 20 29 7b 20 20 20 20   b & 0x01 ){    
22660 20 2f 2a 20 30 78 30 31 20 2d 3e 20 6d 6f 64 74   /* 0x01 -> modt
22670 69 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ime is present *
22680 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6d 54  /.          *pmT
22690 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 47 65 74  ime = zipfileGet
226a0 55 33 32 28 26 70 5b 31 5d 29 3b 0a 20 20 20 20  U32(&p[1]);.    
226b0 20 20 20 20 20 20 72 65 74 20 3d 20 31 3b 0a 20        ret = 1;. 
226c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
226d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
226e0 20 20 20 20 7d 0a 0a 20 20 20 20 70 20 2b 3d 20      }..    p += 
226f0 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
22700 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
22710 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 73 74  * Convert the st
22720 61 6e 64 61 72 64 20 4d 53 2d 44 4f 53 20 74 69  andard MS-DOS ti
22730 6d 65 73 74 61 6d 70 20 73 74 6f 72 65 64 20 69  mestamp stored i
22740 6e 20 74 68 65 20 6d 54 69 6d 65 20 61 6e 64 20  n the mTime and 
22750 6d 44 61 74 65 0a 2a 2a 20 66 69 65 6c 64 73 20  mDate.** fields 
22760 6f 66 20 74 68 65 20 43 44 53 20 73 74 72 75 63  of the CDS struc
22770 74 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74  ture passed as t
22780 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
22790 20 74 6f 20 61 20 33 32 2d 62 69 74 0a 2a 2a 20   to a 32-bit.** 
227a0 55 4e 49 58 20 73 65 63 6f 6e 64 73 2d 73 69 6e  UNIX seconds-sin
227b0 63 65 2d 74 68 65 2d 65 70 6f 63 68 20 74 69 6d  ce-the-epoch tim
227c0 65 73 74 61 6d 70 2e 20 52 65 74 75 72 6e 20 74  estamp. Return t
227d0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
227e0 20 22 53 74 61 6e 64 61 72 64 22 20 4d 53 2d 44   "Standard" MS-D
227f0 4f 53 20 74 69 6d 65 20 66 6f 72 6d 61 74 3a 0a  OS time format:.
22800 2a 2a 0a 2a 2a 20 20 20 46 69 6c 65 20 6d 6f 64  **.**   File mod
22810 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 3a 0a  ification time:.
22820 2a 2a 20 20 20 20 20 42 69 74 73 20 30 30 2d 30  **     Bits 00-0
22830 34 3a 20 73 65 63 6f 6e 64 73 20 64 69 76 69 64  4: seconds divid
22840 65 64 20 62 79 20 32 0a 2a 2a 20 20 20 20 20 42  ed by 2.**     B
22850 69 74 73 20 30 35 2d 31 30 3a 20 6d 69 6e 75 74  its 05-10: minut
22860 65 0a 2a 2a 20 20 20 20 20 42 69 74 73 20 31 31  e.**     Bits 11
22870 2d 31 35 3a 20 68 6f 75 72 0a 2a 2a 20 20 20 46  -15: hour.**   F
22880 69 6c 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  ile modification
22890 20 64 61 74 65 3a 0a 2a 2a 20 20 20 20 20 42 69   date:.**     Bi
228a0 74 73 20 30 30 2d 30 34 3a 20 64 61 79 0a 2a 2a  ts 00-04: day.**
228b0 20 20 20 20 20 42 69 74 73 20 30 35 2d 30 38 3a       Bits 05-08:
228c0 20 6d 6f 6e 74 68 20 28 31 2d 31 32 29 0a 2a 2a   month (1-12).**
228d0 20 20 20 20 20 42 69 74 73 20 30 39 2d 31 35 3a       Bits 09-15:
228e0 20 79 65 61 72 73 20 66 72 6f 6d 20 31 39 38 30   years from 1980
228f0 20 0a 2a 2a 0a 2a 2a 20 68 74 74 70 73 3a 2f 2f   .**.** https://
22900 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  msdn.microsoft.c
22910 6f 6d 2f 65 6e 2d 75 73 2f 6c 69 62 72 61 72 79  om/en-us/library
22920 2f 39 6b 6b 66 39 74 61 68 2e 61 73 70 78 0a 2a  /9kkf9tah.aspx.*
22930 2f 0a 73 74 61 74 69 63 20 75 33 32 20 7a 69 70  /.static u32 zip
22940 66 69 6c 65 4d 74 69 6d 65 28 5a 69 70 66 69 6c  fileMtime(Zipfil
22950 65 43 44 53 20 2a 70 43 44 53 29 7b 0a 20 20 69  eCDS *pCDS){.  i
22960 6e 74 20 59 20 3d 20 28 31 39 38 30 20 2b 20 28  nt Y = (1980 + (
22970 28 70 43 44 53 2d 3e 6d 44 61 74 65 20 3e 3e 20  (pCDS->mDate >> 
22980 39 29 20 26 20 30 78 37 46 29 29 3b 0a 20 20 69  9) & 0x7F));.  i
22990 6e 74 20 4d 20 3d 20 28 28 70 43 44 53 2d 3e 6d  nt M = ((pCDS->m
229a0 44 61 74 65 20 3e 3e 20 35 29 20 26 20 30 78 30  Date >> 5) & 0x0
229b0 46 29 3b 0a 20 20 69 6e 74 20 44 20 3d 20 28 70  F);.  int D = (p
229c0 43 44 53 2d 3e 6d 44 61 74 65 20 26 20 30 78 31  CDS->mDate & 0x1
229d0 46 29 3b 0a 20 20 69 6e 74 20 42 20 3d 20 2d 31  F);.  int B = -1
229e0 33 3b 0a 0a 20 20 69 6e 74 20 73 65 63 20 3d 20  3;..  int sec = 
229f0 28 70 43 44 53 2d 3e 6d 54 69 6d 65 20 26 20 30  (pCDS->mTime & 0
22a00 78 31 46 29 2a 32 3b 0a 20 20 69 6e 74 20 6d 69  x1F)*2;.  int mi
22a10 6e 20 3d 20 28 70 43 44 53 2d 3e 6d 54 69 6d 65  n = (pCDS->mTime
22a20 20 3e 3e 20 35 29 20 26 20 30 78 33 46 3b 0a 20   >> 5) & 0x3F;. 
22a30 20 69 6e 74 20 68 72 20 3d 20 28 70 43 44 53 2d   int hr = (pCDS-
22a40 3e 6d 54 69 6d 65 20 3e 3e 20 31 31 29 20 26 20  >mTime >> 11) & 
22a50 30 78 31 46 3b 0a 20 20 69 36 34 20 4a 44 3b 0a  0x1F;.  i64 JD;.
22a60 0a 20 20 2f 2a 20 4a 44 20 3d 20 49 4e 54 28 33  .  /* JD = INT(3
22a70 36 35 2e 32 35 20 2a 20 28 59 2b 34 37 31 36 29  65.25 * (Y+4716)
22a80 29 20 2b 20 49 4e 54 28 33 30 2e 36 30 30 31 20  ) + INT(30.6001 
22a90 2a 20 28 4d 2b 31 29 29 20 2b 20 44 20 2b 20 42  * (M+1)) + D + B
22aa0 20 2d 20 31 35 32 34 2e 35 20 2a 2f 0a 0a 20 20   - 1524.5 */..  
22ab0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
22ac0 20 4a 44 20 69 6e 20 73 65 63 6f 6e 64 73 20 66   JD in seconds f
22ad0 6f 72 20 6e 6f 6f 6e 20 6f 6e 20 74 68 65 20 64  or noon on the d
22ae0 61 79 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  ay in question *
22af0 2f 0a 20 20 69 66 28 20 4d 3c 33 20 29 7b 0a 20  /.  if( M<3 ){. 
22b00 20 20 20 59 20 3d 20 59 2d 31 3b 0a 20 20 20 20     Y = Y-1;.    
22b10 4d 20 3d 20 4d 2b 31 32 3b 0a 20 20 7d 0a 20 20  M = M+12;.  }.  
22b20 4a 44 20 3d 20 28 69 36 34 29 28 32 34 2a 36 30  JD = (i64)(24*60
22b30 2a 36 30 29 20 2a 20 28 0a 20 20 20 20 20 20 28  *60) * (.      (
22b40 69 6e 74 29 28 33 36 35 2e 32 35 20 2a 20 28 59  int)(365.25 * (Y
22b50 20 2b 20 34 37 31 36 29 29 0a 20 20 20 20 2b 20   + 4716)).    + 
22b60 28 69 6e 74 29 28 33 30 2e 36 30 30 31 20 2a 20  (int)(30.6001 * 
22b70 28 4d 20 2b 20 31 29 29 0a 20 20 20 20 2b 20 44  (M + 1)).    + D
22b80 20 2b 20 42 20 2d 20 31 35 32 34 0a 20 20 29 3b   + B - 1524.  );
22b90 0a 0a 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 74  ..  /* Correct t
22ba0 68 65 20 4a 44 20 66 6f 72 20 74 68 65 20 74 69  he JD for the ti
22bb0 6d 65 20 77 69 74 68 69 6e 20 74 68 65 20 64 61  me within the da
22bc0 79 20 2a 2f 0a 20 20 4a 44 20 2b 3d 20 28 68 72  y */.  JD += (hr
22bd0 2d 31 32 29 20 2a 20 33 36 30 30 20 2b 20 6d 69  -12) * 3600 + mi
22be0 6e 20 2a 20 36 30 20 2b 20 73 65 63 3b 0a 0a 20  n * 60 + sec;.. 
22bf0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4a 44 20 74   /* Convert JD t
22c00 6f 20 75 6e 69 78 20 74 69 6d 65 73 74 61 6d 70  o unix timestamp
22c10 20 28 74 68 65 20 4a 44 20 65 70 6f 63 68 20 69   (the JD epoch i
22c20 73 20 32 34 34 30 35 38 37 2e 35 29 20 2a 2f 0a  s 2440587.5) */.
22c30 20 20 72 65 74 75 72 6e 20 28 75 33 32 29 28 4a    return (u32)(J
22c40 44 20 2d 20 28 69 36 34 29 28 32 34 34 30 35 38  D - (i64)(244058
22c50 37 35 29 20 2a 20 32 34 2a 36 30 2a 36 29 3b 0a  75) * 24*60*6);.
22c60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6f 70 70  }../*.** The opp
22c70 6f 73 69 74 65 20 6f 66 20 7a 69 70 66 69 6c 65  osite of zipfile
22c80 4d 74 69 6d 65 28 29 2e 20 54 68 69 73 20 66 75  Mtime(). This fu
22c90 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
22ca0 20 74 68 65 20 6d 54 69 6d 65 20 61 6e 64 0a 2a   the mTime and.*
22cb0 2a 20 6d 44 61 74 65 20 66 69 65 6c 64 73 20 6f  * mDate fields o
22cc0 66 20 74 68 65 20 43 44 53 20 73 74 72 75 63 74  f the CDS struct
22cd0 75 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ure passed as th
22ce0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
22cf0 20 61 63 63 6f 72 64 69 6e 67 0a 2a 2a 20 74 6f   according.** to
22d00 20 74 68 65 20 55 4e 49 58 20 74 69 6d 65 73 74   the UNIX timest
22d10 61 6d 70 20 76 61 6c 75 65 20 70 61 73 73 65 64  amp value passed
22d20 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a   as the second..
22d30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
22d40 69 70 66 69 6c 65 4d 74 69 6d 65 54 6f 44 6f 73  ipfileMtimeToDos
22d50 28 5a 69 70 66 69 6c 65 43 44 53 20 2a 70 43 64  (ZipfileCDS *pCd
22d60 73 2c 20 75 33 32 20 6d 55 6e 69 78 54 69 6d 65  s, u32 mUnixTime
22d70 29 7b 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ){.  /* Convert 
22d80 75 6e 69 78 20 74 69 6d 65 73 74 61 6d 70 20 74  unix timestamp t
22d90 6f 20 4a 44 20 28 32 34 34 30 35 38 38 20 69 73  o JD (2440588 is
22da0 20 6e 6f 6f 6e 20 6f 6e 20 31 2f 31 2f 31 39 37   noon on 1/1/197
22db0 30 29 20 2a 2f 0a 20 20 69 36 34 20 4a 44 20 3d  0) */.  i64 JD =
22dc0 20 28 69 36 34 29 32 34 34 30 35 38 38 20 2b 20   (i64)2440588 + 
22dd0 6d 55 6e 69 78 54 69 6d 65 20 2f 20 28 32 34 2a  mUnixTime / (24*
22de0 36 30 2a 36 30 29 3b 0a 0a 20 20 69 6e 74 20 41  60*60);..  int A
22df0 2c 20 42 2c 20 43 2c 20 44 2c 20 45 3b 0a 20 20  , B, C, D, E;.  
22e00 69 6e 74 20 79 72 2c 20 6d 6f 6e 2c 20 64 61 79  int yr, mon, day
22e10 3b 0a 20 20 69 6e 74 20 68 72 2c 20 6d 69 6e 2c  ;.  int hr, min,
22e20 20 73 65 63 3b 0a 0a 20 20 41 20 3d 20 28 69 6e   sec;..  A = (in
22e30 74 29 28 28 4a 44 20 2d 20 31 38 36 37 32 31 36  t)((JD - 1867216
22e40 2e 32 35 29 2f 33 36 35 32 34 2e 32 35 29 3b 0a  .25)/36524.25);.
22e50 20 20 41 20 3d 20 28 69 6e 74 29 28 4a 44 20 2b    A = (int)(JD +
22e60 20 31 20 2b 20 41 20 2d 20 28 41 2f 34 29 29 3b   1 + A - (A/4));
22e70 0a 20 20 42 20 3d 20 41 20 2b 20 31 35 32 34 3b  .  B = A + 1524;
22e80 0a 20 20 43 20 3d 20 28 69 6e 74 29 28 28 42 20  .  C = (int)((B 
22e90 2d 20 31 32 32 2e 31 29 2f 33 36 35 2e 32 35 29  - 122.1)/365.25)
22ea0 3b 0a 20 20 44 20 3d 20 28 33 36 35 32 35 2a 28  ;.  D = (36525*(
22eb0 43 26 33 32 37 36 37 29 29 2f 31 30 30 3b 0a 20  C&32767))/100;. 
22ec0 20 45 20 3d 20 28 69 6e 74 29 28 28 42 2d 44 29   E = (int)((B-D)
22ed0 2f 33 30 2e 36 30 30 31 29 3b 0a 0a 20 20 64 61  /30.6001);..  da
22ee0 79 20 3d 20 42 20 2d 20 44 20 2d 20 28 69 6e 74  y = B - D - (int
22ef0 29 28 33 30 2e 36 30 30 31 2a 45 29 3b 0a 20 20  )(30.6001*E);.  
22f00 6d 6f 6e 20 3d 20 28 45 3c 31 34 20 3f 20 45 2d  mon = (E<14 ? E-
22f10 31 20 3a 20 45 2d 31 33 29 3b 0a 20 20 79 72 20  1 : E-13);.  yr 
22f20 3d 20 6d 6f 6e 3e 32 20 3f 20 43 2d 34 37 31 36  = mon>2 ? C-4716
22f30 20 3a 20 43 2d 34 37 31 35 3b 0a 0a 20 20 68 72   : C-4715;..  hr
22f40 20 3d 20 28 6d 55 6e 69 78 54 69 6d 65 20 25 20   = (mUnixTime % 
22f50 28 32 34 2a 36 30 2a 36 30 29 29 20 2f 20 28 36  (24*60*60)) / (6
22f60 30 2a 36 30 29 3b 0a 20 20 6d 69 6e 20 3d 20 28  0*60);.  min = (
22f70 6d 55 6e 69 78 54 69 6d 65 20 25 20 28 36 30 2a  mUnixTime % (60*
22f80 36 30 29 29 20 2f 20 36 30 3b 0a 20 20 73 65 63  60)) / 60;.  sec
22f90 20 3d 20 28 6d 55 6e 69 78 54 69 6d 65 20 25 20   = (mUnixTime % 
22fa0 36 30 29 3b 0a 0a 20 20 69 66 28 20 79 72 3e 3d  60);..  if( yr>=
22fb0 31 39 38 30 20 29 7b 0a 20 20 20 20 70 43 64 73  1980 ){.    pCds
22fc0 2d 3e 6d 44 61 74 65 20 3d 20 28 75 31 36 29 28  ->mDate = (u16)(
22fd0 64 61 79 20 2b 20 28 6d 6f 6e 20 3c 3c 20 35 29  day + (mon << 5)
22fe0 20 2b 20 28 28 79 72 2d 31 39 38 30 29 20 3c 3c   + ((yr-1980) <<
22ff0 20 39 29 29 3b 0a 20 20 20 20 70 43 64 73 2d 3e   9));.    pCds->
23000 6d 54 69 6d 65 20 3d 20 28 75 31 36 29 28 73 65  mTime = (u16)(se
23010 63 2f 32 20 2b 20 28 6d 69 6e 3c 3c 35 29 20 2b  c/2 + (min<<5) +
23020 20 28 68 72 3c 3c 31 31 29 29 3b 0a 20 20 7d 65   (hr<<11));.  }e
23030 6c 73 65 7b 0a 20 20 20 20 70 43 64 73 2d 3e 6d  lse{.    pCds->m
23040 44 61 74 65 20 3d 20 70 43 64 73 2d 3e 6d 54 69  Date = pCds->mTi
23050 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 61  me = 0;.  }..  a
23060 73 73 65 72 74 28 20 6d 55 6e 69 78 54 69 6d 65  ssert( mUnixTime
23070 3c 33 31 35 35 30 37 36 30 30 20 0a 20 20 20 20  <315507600 .    
23080 20 20 20 7c 7c 20 6d 55 6e 69 78 54 69 6d 65 3d     || mUnixTime=
23090 3d 7a 69 70 66 69 6c 65 4d 74 69 6d 65 28 70 43  =zipfileMtime(pC
230a0 64 73 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  ds) .       || (
230b0 28 6d 55 6e 69 78 54 69 6d 65 20 25 20 32 29 20  (mUnixTime % 2) 
230c0 26 26 20 6d 55 6e 69 78 54 69 6d 65 2d 31 3d 3d  && mUnixTime-1==
230d0 7a 69 70 66 69 6c 65 4d 74 69 6d 65 28 70 43 64  zipfileMtime(pCd
230e0 73 29 29 20 0a 20 20 20 20 20 20 20 2f 2a 20 7c  s)) .       /* |
230f0 7c 20 28 6d 55 6e 69 78 54 69 6d 65 20 25 20 32  | (mUnixTime % 2
23100 29 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ) */.  );.}../*.
23110 2a 2a 20 49 66 20 61 42 6c 6f 62 20 69 73 20 6e  ** If aBlob is n
23120 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  ot NULL, then it
23130 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
23140 20 61 20 62 75 66 66 65 72 20 28 6e 42 6c 6f 62   a buffer (nBlob
23150 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
23160 65 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  e) containing an
23170 20 65 6e 74 69 72 65 20 7a 69 70 20 61 72 63 68   entire zip arch
23180 69 76 65 20 69 6d 61 67 65 2e 20 4f 72 2c 20 69  ive image. Or, i
23190 66 20 61 42 6c 6f 62 20 69 73 20 4e 55 4c 4c 2c  f aBlob is NULL,
231a0 0a 2a 2a 20 74 68 65 6e 20 70 46 69 6c 65 20 69  .** then pFile i
231b0 73 20 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  s a file-handle 
231c0 6f 70 65 6e 20 6f 6e 20 61 20 7a 69 70 20 66 69  open on a zip fi
231d0 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
231e0 73 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  se, this.** func
231f0 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 5a  tion creates a Z
23200 69 70 66 69 6c 65 45 6e 74 72 79 20 6f 62 6a 65  ipfileEntry obje
23210 63 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ct based on the 
23220 7a 69 70 20 61 72 63 68 69 76 65 20 65 6e 74 72  zip archive entr
23230 79 0a 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74  y.** for which t
23240 68 65 20 43 44 53 20 72 65 63 6f 72 64 20 69 73  he CDS record is
23250 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 2e   at offset iOff.
23260 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
23270 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
23280 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23290 28 2a 70 70 45 6e 74 72 79 29 20 73 65 74 20 74  (*ppEntry) set t
232a0 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
232b0 65 20 6e 65 77 20 6f 62 6a 65 63 74 2e 20 4f 74  e new object. Ot
232c0 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
232d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
232e0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
232f0 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75 65  e.** final value
23300 20 6f 66 20 28 2a 70 70 45 6e 74 72 79 29 20 75   of (*ppEntry) u
23310 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
23320 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 47  tic int zipfileG
23330 65 74 45 6e 74 72 79 28 0a 20 20 5a 69 70 66 69  etEntry(.  Zipfi
23340 6c 65 54 61 62 20 2a 70 54 61 62 2c 20 20 20 20  leTab *pTab,    
23350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
23360 6f 72 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ore any error me
23370 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20  ssage here */.  
23380 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 2c  const u8 *aBlob,
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e  /* Pointer to in
233b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 6d 61  -memory file ima
233c0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 6c 6f  ge */.  int nBlo
233d0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
233e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
233f0 6f 66 20 61 42 6c 6f 62 5b 5d 20 69 6e 20 62 79  of aBlob[] in by
23400 74 65 73 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70  tes */.  FILE *p
23410 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
23420 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
23430 42 6c 6f 62 3d 3d 30 2c 20 72 65 61 64 20 66 72  Blob==0, read fr
23440 6f 6d 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  om this file */.
23450 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20    i64 iOff,     
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 43    /* Offset of C
23480 44 53 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 5a  DS record */.  Z
23490 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 2a 70 70  ipfileEntry **pp
234a0 45 6e 74 72 79 20 20 20 20 20 20 20 20 20 20 2f  Entry          /
234b0 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  * OUT: Pointer t
234c0 6f 20 6e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  o new object */.
234d0 29 7b 0a 20 20 75 38 20 2a 61 52 65 61 64 3b 0a  ){.  u8 *aRead;.
234e0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 3d    char **pzErr =
234f0 20 26 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72   &pTab->base.zEr
23500 72 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  rMsg;.  int rc =
23510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
23520 66 28 20 61 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20  f( aBlob==0 ){. 
23530 20 20 20 61 52 65 61 64 20 3d 20 70 54 61 62 2d     aRead = pTab-
23540 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 72 63  >aBuffer;.    rc
23550 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 44 61   = zipfileReadDa
23560 74 61 28 70 46 69 6c 65 2c 20 61 52 65 61 64 2c  ta(pFile, aRead,
23570 20 5a 49 50 46 49 4c 45 5f 43 44 53 5f 46 49 58   ZIPFILE_CDS_FIX
23580 45 44 5f 53 5a 2c 20 69 4f 66 66 2c 20 70 7a 45  ED_SZ, iOff, pzE
23590 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rr);.  }else{.  
235a0 20 20 61 52 65 61 64 20 3d 20 28 75 38 2a 29 26    aRead = (u8*)&
235b0 61 42 6c 6f 62 5b 69 4f 66 66 5d 3b 0a 20 20 7d  aBlob[iOff];.  }
235c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
235d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
235e0 69 74 65 33 5f 69 6e 74 36 34 20 6e 41 6c 6c 6f  ite3_int64 nAllo
235f0 63 3b 0a 20 20 20 20 5a 69 70 66 69 6c 65 45 6e  c;.    ZipfileEn
23600 74 72 79 20 2a 70 4e 65 77 3b 0a 0a 20 20 20 20  try *pNew;..    
23610 69 6e 74 20 6e 46 69 6c 65 20 3d 20 7a 69 70 66  int nFile = zipf
23620 69 6c 65 47 65 74 55 31 36 28 26 61 52 65 61 64  ileGetU16(&aRead
23630 5b 5a 49 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49  [ZIPFILE_CDS_NFI
23640 4c 45 5f 4f 46 46 5d 29 3b 0a 20 20 20 20 69 6e  LE_OFF]);.    in
23650 74 20 6e 45 78 74 72 61 20 3d 20 7a 69 70 66 69  t nExtra = zipfi
23660 6c 65 47 65 74 55 31 36 28 26 61 52 65 61 64 5b  leGetU16(&aRead[
23670 5a 49 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49 4c  ZIPFILE_CDS_NFIL
23680 45 5f 4f 46 46 2b 32 5d 29 3b 0a 20 20 20 20 6e  E_OFF+2]);.    n
23690 45 78 74 72 61 20 2b 3d 20 7a 69 70 66 69 6c 65  Extra += zipfile
236a0 47 65 74 55 31 36 28 26 61 52 65 61 64 5b 5a 49  GetU16(&aRead[ZI
236b0 50 46 49 4c 45 5f 43 44 53 5f 4e 46 49 4c 45 5f  PFILE_CDS_NFILE_
236c0 4f 46 46 2b 34 5d 29 3b 0a 0a 20 20 20 20 6e 41  OFF+4]);..    nA
236d0 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 5a 69  lloc = sizeof(Zi
236e0 70 66 69 6c 65 45 6e 74 72 79 29 20 2b 20 6e 45  pfileEntry) + nE
236f0 78 74 72 61 3b 0a 20 20 20 20 69 66 28 20 61 42  xtra;.    if( aB
23700 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 6e 41 6c  lob ){.      nAl
23710 6c 6f 63 20 2b 3d 20 7a 69 70 66 69 6c 65 47 65  loc += zipfileGe
23720 74 55 33 32 28 26 61 52 65 61 64 5b 5a 49 50 46  tU32(&aRead[ZIPF
23730 49 4c 45 5f 43 44 53 5f 53 5a 43 4f 4d 50 52 45  ILE_CDS_SZCOMPRE
23740 53 53 45 44 5f 4f 46 46 5d 29 3b 0a 20 20 20 20  SSED_OFF]);.    
23750 7d 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 5a  }..    pNew = (Z
23760 69 70 66 69 6c 65 45 6e 74 72 79 2a 29 73 71 6c  ipfileEntry*)sql
23770 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 41  ite3_malloc64(nA
23780 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
23790 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
237a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
237b0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
237c0 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
237d0 20 30 2c 20 73 69 7a 65 6f 66 28 5a 69 70 66 69   0, sizeof(Zipfi
237e0 6c 65 45 6e 74 72 79 29 29 3b 0a 20 20 20 20 20  leEntry));.     
237f0 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 52 65 61   rc = zipfileRea
23800 64 43 44 53 28 61 52 65 61 64 2c 20 26 70 4e 65  dCDS(aRead, &pNe
23810 77 2d 3e 63 64 73 29 3b 0a 20 20 20 20 20 20 69  w->cds);.      i
23820 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23830 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
23840 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
23850 69 6e 74 66 28 22 66 61 69 6c 65 64 20 74 6f 20  intf("failed to 
23860 72 65 61 64 20 43 44 53 20 61 74 20 6f 66 66 73  read CDS at offs
23870 65 74 20 25 6c 6c 64 22 2c 20 69 4f 66 66 29 3b  et %lld", iOff);
23880 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
23890 20 61 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 20 20   aBlob==0 ){.   
238a0 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c       rc = zipfil
238b0 65 52 65 61 64 44 61 74 61 28 0a 20 20 20 20 20  eReadData(.     
238c0 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 61 52         pFile, aR
238d0 65 61 64 2c 20 6e 45 78 74 72 61 2b 6e 46 69 6c  ead, nExtra+nFil
238e0 65 2c 20 69 4f 66 66 2b 5a 49 50 46 49 4c 45 5f  e, iOff+ZIPFILE_
238f0 43 44 53 5f 46 49 58 45 44 5f 53 5a 2c 20 70 7a  CDS_FIXED_SZ, pz
23900 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Err.        );. 
23910 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23920 20 20 20 20 61 52 65 61 64 20 3d 20 28 75 38 2a      aRead = (u8*
23930 29 26 61 42 6c 6f 62 5b 69 4f 66 66 20 2b 20 5a  )&aBlob[iOff + Z
23940 49 50 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44  IPFILE_CDS_FIXED
23950 5f 53 5a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _SZ];.      }.  
23960 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
23970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23980 20 20 20 20 75 33 32 20 2a 70 74 20 3d 20 26 70      u32 *pt = &p
23990 4e 65 77 2d 3e 6d 55 6e 69 78 54 69 6d 65 3b 0a  New->mUnixTime;.
239a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 63 64 73 2e        pNew->cds.
239b0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
239c0 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20  mprintf("%.*s", 
239d0 6e 46 69 6c 65 2c 20 61 52 65 61 64 29 3b 20 0a  nFile, aRead); .
239e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 45 78 74        pNew->aExt
239f0 72 61 20 3d 20 28 75 38 2a 29 26 70 4e 65 77 5b  ra = (u8*)&pNew[
23a00 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  1];.      memcpy
23a10 28 70 4e 65 77 2d 3e 61 45 78 74 72 61 2c 20 26  (pNew->aExtra, &
23a20 61 52 65 61 64 5b 6e 46 69 6c 65 5d 2c 20 6e 45  aRead[nFile], nE
23a30 78 74 72 61 29 3b 0a 20 20 20 20 20 20 69 66 28  xtra);.      if(
23a40 20 70 4e 65 77 2d 3e 63 64 73 2e 7a 46 69 6c 65   pNew->cds.zFile
23a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
23a60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23a70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
23a80 28 20 30 3d 3d 7a 69 70 66 69 6c 65 53 63 61 6e  ( 0==zipfileScan
23a90 45 78 74 72 61 28 26 61 52 65 61 64 5b 6e 46 69  Extra(&aRead[nFi
23aa0 6c 65 5d 2c 20 70 4e 65 77 2d 3e 63 64 73 2e 6e  le], pNew->cds.n
23ab0 45 78 74 72 61 2c 20 70 74 29 20 29 7b 0a 20 20  Extra, pt) ){.  
23ac0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 55 6e 69        pNew->mUni
23ad0 78 54 69 6d 65 20 3d 20 7a 69 70 66 69 6c 65 4d  xTime = zipfileM
23ae0 74 69 6d 65 28 26 70 4e 65 77 2d 3e 63 64 73 29  time(&pNew->cds)
23af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23b00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23b20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
23b30 20 73 7a 46 69 78 20 3d 20 5a 49 50 46 49 4c 45   szFix = ZIPFILE
23b40 5f 4c 46 48 5f 46 49 58 45 44 5f 53 5a 3b 0a 20  _LFH_FIXED_SZ;. 
23b50 20 20 20 20 20 5a 69 70 66 69 6c 65 4c 46 48 20       ZipfileLFH 
23b60 6c 66 68 3b 0a 20 20 20 20 20 20 69 66 28 20 70  lfh;.      if( p
23b70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
23b80 72 63 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  rc = zipfileRead
23b90 44 61 74 61 28 70 46 69 6c 65 2c 20 61 52 65 61  Data(pFile, aRea
23ba0 64 2c 20 73 7a 46 69 78 2c 20 70 4e 65 77 2d 3e  d, szFix, pNew->
23bb0 63 64 73 2e 69 4f 66 66 73 65 74 2c 20 70 7a 45  cds.iOffset, pzE
23bc0 72 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rr);.      }else
23bd0 7b 0a 20 20 20 20 20 20 20 20 61 52 65 61 64 20  {.        aRead 
23be0 3d 20 28 75 38 2a 29 26 61 42 6c 6f 62 5b 70 4e  = (u8*)&aBlob[pN
23bf0 65 77 2d 3e 63 64 73 2e 69 4f 66 66 73 65 74 5d  ew->cds.iOffset]
23c00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
23c10 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 52 65 61   rc = zipfileRea
23c20 64 4c 46 48 28 61 52 65 61 64 2c 20 26 6c 66 68  dLFH(aRead, &lfh
23c30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
23c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23c50 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 44 61 74        pNew->iDat
23c60 61 4f 66 66 20 3d 20 20 70 4e 65 77 2d 3e 63 64  aOff =  pNew->cd
23c70 73 2e 69 4f 66 66 73 65 74 20 2b 20 5a 49 50 46  s.iOffset + ZIPF
23c80 49 4c 45 5f 4c 46 48 5f 46 49 58 45 44 5f 53 5a  ILE_LFH_FIXED_SZ
23c90 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
23ca0 69 44 61 74 61 4f 66 66 20 2b 3d 20 6c 66 68 2e  iDataOff += lfh.
23cb0 6e 46 69 6c 65 20 2b 20 6c 66 68 2e 6e 45 78 74  nFile + lfh.nExt
23cc0 72 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ra;.        if( 
23cd0 61 42 6c 6f 62 20 26 26 20 70 4e 65 77 2d 3e 63  aBlob && pNew->c
23ce0 64 73 2e 73 7a 43 6f 6d 70 72 65 73 73 65 64 20  ds.szCompressed 
23cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
23d00 77 2d 3e 61 44 61 74 61 20 3d 20 26 70 4e 65 77  w->aData = &pNew
23d10 2d 3e 61 45 78 74 72 61 5b 6e 45 78 74 72 61 5d  ->aExtra[nExtra]
23d20 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
23d30 70 79 28 70 4e 65 77 2d 3e 61 44 61 74 61 2c 20  py(pNew->aData, 
23d40 26 61 42 6c 6f 62 5b 70 4e 65 77 2d 3e 69 44 61  &aBlob[pNew->iDa
23d50 74 61 4f 66 66 5d 2c 20 70 4e 65 77 2d 3e 63 64  taOff], pNew->cd
23d60 73 2e 73 7a 43 6f 6d 70 72 65 73 73 65 64 29 3b  s.szCompressed);
23d70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23d90 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
23da0 5f 6d 70 72 69 6e 74 66 28 22 66 61 69 6c 65 64  _mprintf("failed
23db0 20 74 6f 20 72 65 61 64 20 4c 46 48 20 61 74 20   to read LFH at 
23dc0 6f 66 66 73 65 74 20 25 64 22 2c 20 0a 20 20 20  offset %d", .   
23dd0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 4e           (int)pN
23de0 65 77 2d 3e 63 64 73 2e 69 4f 66 66 73 65 74 0a  ew->cds.iOffset.
23df0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
23e00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
23e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23e20 29 7b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65  ){.      zipfile
23e30 45 6e 74 72 79 46 72 65 65 28 70 4e 65 77 29 3b  EntryFree(pNew);
23e40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23e50 20 20 2a 70 70 45 6e 74 72 79 20 3d 20 70 4e 65    *ppEntry = pNe
23e60 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  w;.    }.  }..  
23e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23e80 0a 2a 2a 20 41 64 76 61 6e 63 65 20 61 6e 20 5a  .** Advance an Z
23e90 69 70 66 69 6c 65 43 73 72 20 74 6f 20 69 74 73  ipfileCsr to its
23ea0 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 6f 75 74   next row of out
23eb0 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  put..*/.static i
23ec0 6e 74 20 7a 69 70 66 69 6c 65 4e 65 78 74 28 73  nt zipfileNext(s
23ed0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
23ee0 6f 72 20 2a 63 75 72 29 7b 0a 20 20 5a 69 70 66  or *cur){.  Zipf
23ef0 69 6c 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28  ileCsr *pCsr = (
23f00 5a 69 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b  ZipfileCsr*)cur;
23f10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23f20 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 43  TE_OK;..  if( pC
23f30 73 72 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20  sr->pFile ){.   
23f40 20 69 36 34 20 69 45 6f 66 20 3d 20 70 43 73 72   i64 iEof = pCsr
23f50 2d 3e 65 6f 63 64 2e 69 4f 66 66 73 65 74 20 2b  ->eocd.iOffset +
23f60 20 70 43 73 72 2d 3e 65 6f 63 64 2e 6e 53 69 7a   pCsr->eocd.nSiz
23f70 65 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 45 6e  e;.    zipfileEn
23f80 74 72 79 46 72 65 65 28 70 43 73 72 2d 3e 70 43  tryFree(pCsr->pC
23f90 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 70 43 73  urrent);.    pCs
23fa0 72 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 30 3b  r->pCurrent = 0;
23fb0 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69  .    if( pCsr->i
23fc0 4e 65 78 74 4f 66 66 3e 3d 69 45 6f 66 20 29 7b  NextOff>=iEof ){
23fd0 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 62 45 6f  .      pCsr->bEo
23fe0 66 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 1;.    }else
23ff0 7b 0a 20 20 20 20 20 20 5a 69 70 66 69 6c 65 45  {.      ZipfileE
24000 6e 74 72 79 20 2a 70 20 3d 20 30 3b 0a 20 20 20  ntry *p = 0;.   
24010 20 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70     ZipfileTab *p
24020 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61  Tab = (ZipfileTa
24030 62 2a 29 28 63 75 72 2d 3e 70 56 74 61 62 29 3b  b*)(cur->pVtab);
24040 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66  .      rc = zipf
24050 69 6c 65 47 65 74 45 6e 74 72 79 28 70 54 61 62  ileGetEntry(pTab
24060 2c 20 30 2c 20 30 2c 20 70 43 73 72 2d 3e 70 46  , 0, 0, pCsr->pF
24070 69 6c 65 2c 20 70 43 73 72 2d 3e 69 4e 65 78 74  ile, pCsr->iNext
24080 4f 66 66 2c 20 26 70 29 3b 0a 20 20 20 20 20 20  Off, &p);.      
24090 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
240a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73  K ){.        pCs
240b0 72 2d 3e 69 4e 65 78 74 4f 66 66 20 2b 3d 20 5a  r->iNextOff += Z
240c0 49 50 46 49 4c 45 5f 43 44 53 5f 46 49 58 45 44  IPFILE_CDS_FIXED
240d0 5f 53 5a 3b 0a 20 20 20 20 20 20 20 20 70 43 73  _SZ;.        pCs
240e0 72 2d 3e 69 4e 65 78 74 4f 66 66 20 2b 3d 20 28  r->iNextOff += (
240f0 69 6e 74 29 70 2d 3e 63 64 73 2e 6e 45 78 74 72  int)p->cds.nExtr
24100 61 20 2b 20 70 2d 3e 63 64 73 2e 6e 46 69 6c 65  a + p->cds.nFile
24110 20 2b 20 70 2d 3e 63 64 73 2e 6e 43 6f 6d 6d 65   + p->cds.nComme
24120 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nt;.      }.    
24130 20 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74    pCsr->pCurrent
24140 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = p;.    }.  }e
24150 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 21 70 43  lse{.    if( !pC
24160 73 72 2d 3e 62 4e 6f 6f 70 20 29 7b 0a 20 20 20  sr->bNoop ){.   
24170 20 20 20 70 43 73 72 2d 3e 70 43 75 72 72 65 6e     pCsr->pCurren
24180 74 20 3d 20 70 43 73 72 2d 3e 70 43 75 72 72 65  t = pCsr->pCurre
24190 6e 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  nt->pNext;.    }
241a0 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70  .    if( pCsr->p
241b0 43 75 72 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  Current==0 ){.  
241c0 20 20 20 20 70 43 73 72 2d 3e 62 45 6f 66 20 3d      pCsr->bEof =
241d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
241e0 20 70 43 73 72 2d 3e 62 4e 6f 6f 70 20 3d 20 30   pCsr->bNoop = 0
241f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24200 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69  ..static void zi
24210 70 66 69 6c 65 46 72 65 65 28 76 6f 69 64 20 2a  pfileFree(void *
24220 70 29 20 7b 20 0a 20 20 73 71 6c 69 74 65 33 5f  p) { .  sqlite3_
24230 66 72 65 65 28 70 29 3b 20 0a 7d 0a 0a 2f 2a 0a  free(p); .}../*.
24240 2a 2a 20 42 75 66 66 65 72 20 61 49 6e 20 28 73  ** Buffer aIn (s
24250 69 7a 65 20 6e 49 6e 20 62 79 74 65 73 29 20 63  ize nIn bytes) c
24260 6f 6e 74 61 69 6e 73 20 63 6f 6d 70 72 65 73 73  ontains compress
24270 65 64 20 64 61 74 61 2e 20 55 6e 63 6f 6d 70 72  ed data. Uncompr
24280 65 73 73 65 64 2c 20 74 68 65 0a 2a 2a 20 73 69  essed, the.** si
24290 7a 65 20 69 73 20 6e 4f 75 74 20 62 79 74 65 73  ze is nOut bytes
242a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
242b0 75 6e 63 6f 6d 70 72 65 73 73 65 73 20 74 68 65  uncompresses the
242c0 20 64 61 74 61 20 61 6e 64 20 73 65 74 73 20 74   data and sets t
242d0 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
242e0 75 65 20 69 6e 20 63 6f 6e 74 65 78 74 20 70 43  ue in context pC
242f0 74 78 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  tx to the result
24300 20 28 61 20 62 6c 6f 62 29 2e 0a 2a 2a 0a 2a 2a   (a blob)..**.**
24310 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
24320 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
24330 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 43  de is left in pC
24340 74 78 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73  tx instead..*/.s
24350 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69  tatic void zipfi
24360 6c 65 49 6e 66 6c 61 74 65 28 0a 20 20 73 71 6c  leInflate(.  sql
24370 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
24380 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tx,          /* 
24390 53 74 6f 72 65 20 72 65 73 75 6c 74 20 68 65 72  Store result her
243a0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  e */.  const u8 
243b0 2a 61 49 6e 2c 20 20 20 20 20 20 20 20 20 20 20  *aIn,           
243c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65         /* Compre
243d0 73 73 65 64 20 64 61 74 61 20 2a 2f 0a 20 20 69  ssed data */.  i
243e0 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24400 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
24410 20 61 49 6e 5b 5d 20 69 6e 20 62 79 74 65 73 20   aIn[] in bytes 
24420 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20 20 20  */.  int nOut   
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
24450 20 6f 75 74 70 75 74 20 73 69 7a 65 20 2a 2f 0a   output size */.
24460 29 7b 0a 20 20 75 38 20 2a 61 52 65 73 20 3d 20  ){.  u8 *aRes = 
24470 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
24480 4f 75 74 29 3b 0a 20 20 69 66 28 20 61 52 65 73  Out);.  if( aRes
24490 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
244a0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
244b0 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 7d  nomem(pCtx);.  }
244c0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 72  else{.    int er
244d0 72 3b 0a 20 20 20 20 7a 5f 73 74 72 65 61 6d 20  r;.    z_stream 
244e0 73 74 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  str;.    memset(
244f0 26 73 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &str, 0, sizeof(
24500 73 74 72 29 29 3b 0a 0a 20 20 20 20 73 74 72 2e  str));..    str.
24510 6e 65 78 74 5f 69 6e 20 3d 20 28 42 79 74 65 2a  next_in = (Byte*
24520 29 61 49 6e 3b 0a 20 20 20 20 73 74 72 2e 61 76  )aIn;.    str.av
24530 61 69 6c 5f 69 6e 20 3d 20 6e 49 6e 3b 0a 20 20  ail_in = nIn;.  
24540 20 20 73 74 72 2e 6e 65 78 74 5f 6f 75 74 20 3d    str.next_out =
24550 20 28 42 79 74 65 2a 29 61 52 65 73 3b 0a 20 20   (Byte*)aRes;.  
24560 20 20 73 74 72 2e 61 76 61 69 6c 5f 6f 75 74 20    str.avail_out 
24570 3d 20 6e 4f 75 74 3b 0a 0a 20 20 20 20 65 72 72  = nOut;..    err
24580 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 32 28   = inflateInit2(
24590 26 73 74 72 2c 20 2d 31 35 29 3b 0a 20 20 20 20  &str, -15);.    
245a0 69 66 28 20 65 72 72 21 3d 5a 5f 4f 4b 20 29 7b  if( err!=Z_OK ){
245b0 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65 43 74  .      zipfileCt
245c0 78 45 72 72 6f 72 4d 73 67 28 70 43 74 78 2c 20  xErrorMsg(pCtx, 
245d0 22 69 6e 66 6c 61 74 65 49 6e 69 74 32 28 29 20  "inflateInit2() 
245e0 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
245f0 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
24600 20 20 20 20 20 65 72 72 20 3d 20 69 6e 66 6c 61       err = infla
24610 74 65 28 26 73 74 72 2c 20 5a 5f 4e 4f 5f 46 4c  te(&str, Z_NO_FL
24620 55 53 48 29 3b 0a 20 20 20 20 20 20 69 66 28 20  USH);.      if( 
24630 65 72 72 21 3d 5a 5f 53 54 52 45 41 4d 5f 45 4e  err!=Z_STREAM_EN
24640 44 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 69 70  D ){.        zip
24650 66 69 6c 65 43 74 78 45 72 72 6f 72 4d 73 67 28  fileCtxErrorMsg(
24660 70 43 74 78 2c 20 22 69 6e 66 6c 61 74 65 28 29  pCtx, "inflate()
24670 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65   failed (%d)", e
24680 72 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rr);.      }else
24690 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
246a0 33 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 70 43  3_result_blob(pC
246b0 74 78 2c 20 61 52 65 73 2c 20 6e 4f 75 74 2c 20  tx, aRes, nOut, 
246c0 7a 69 70 66 69 6c 65 46 72 65 65 29 3b 0a 20 20  zipfileFree);.  
246d0 20 20 20 20 20 20 61 52 65 73 20 3d 20 30 3b 0a        aRes = 0;.
246e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
246f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
24700 52 65 73 29 3b 0a 20 20 20 20 69 6e 66 6c 61 74  Res);.    inflat
24710 65 45 6e 64 28 26 73 74 72 29 3b 0a 20 20 7d 0a  eEnd(&str);.  }.
24720 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  }../*.** Buffer 
24730 61 49 6e 20 28 73 69 7a 65 20 6e 49 6e 20 62 79  aIn (size nIn by
24740 74 65 73 29 20 63 6f 6e 74 61 69 6e 73 20 75 6e  tes) contains un
24750 63 6f 6d 70 72 65 73 73 65 64 20 64 61 74 61 2e  compressed data.
24760 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
24770 2a 20 63 6f 6d 70 72 65 73 73 65 73 20 69 74 20  * compresses it 
24780 61 6e 64 20 73 65 74 73 20 28 2a 70 70 4f 75 74  and sets (*ppOut
24790 29 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  ) to point to a 
247a0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
247b0 67 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 72 65 73  g the.** compres
247c0 73 65 64 20 64 61 74 61 2e 20 54 68 65 20 63 61  sed data. The ca
247d0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
247e0 62 6c 65 20 66 6f 72 20 65 76 65 6e 74 75 61 6c  ble for eventual
247f0 6c 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  ly calling.** sq
24800 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
24810 72 65 6c 65 61 73 65 20 62 75 66 66 65 72 20 28  release buffer (
24820 2a 70 70 4f 75 74 29 2e 20 42 65 66 6f 72 65 20  *ppOut). Before 
24830 72 65 74 75 72 6e 69 6e 67 2c 20 28 2a 70 6e 4f  returning, (*pnO
24840 75 74 29 20 0a 2a 2a 20 69 73 20 73 65 74 20 74  ut) .** is set t
24850 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 62 75  o the size of bu
24860 66 66 65 72 20 28 2a 70 70 4f 75 74 29 20 69 6e  ffer (*ppOut) in
24870 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
24880 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
24890 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
248a0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
248b0 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  se, an SQLite er
248c0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
248d0 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
248e0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 66  rror message lef
248f0 74 20 69 6e 20 76 69 72 74 75 61 6c 2d 74 61 62  t in virtual-tab
24900 6c 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 70 54 61  le handle.** pTa
24910 62 2e 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66  b. The values of
24920 20 28 2a 70 70 4f 75 74 29 20 61 6e 64 20 28 2a   (*ppOut) and (*
24930 70 6e 4f 75 74 29 20 61 72 65 20 6c 65 66 74 20  pnOut) are left 
24940 75 6e 63 68 61 6e 67 65 64 20 69 6e 20 74 68 69  unchanged in thi
24950 73 0a 2a 2a 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  s.** case..*/.st
24960 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
24970 44 65 66 6c 61 74 65 28 0a 20 20 63 6f 6e 73 74  Deflate(.  const
24980 20 75 38 20 2a 61 49 6e 2c 20 69 6e 74 20 6e 49   u8 *aIn, int nI
24990 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  n,         /* In
249a0 70 75 74 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  put */.  u8 **pp
249b0 4f 75 74 2c 20 69 6e 74 20 2a 70 6e 4f 75 74 2c  Out, int *pnOut,
249c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
249d0 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ut */.  char **p
249e0 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  zErr            
249f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
24a00 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
24a10 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  .){.  sqlite3_in
24a20 74 36 34 20 6e 41 6c 6c 6f 63 20 3d 20 63 6f 6d  t64 nAlloc = com
24a30 70 72 65 73 73 42 6f 75 6e 64 28 6e 49 6e 29 3b  pressBound(nIn);
24a40 0a 20 20 75 38 20 2a 61 4f 75 74 3b 0a 20 20 69  .  u8 *aOut;.  i
24a50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24a60 4b 3b 0a 0a 20 20 61 4f 75 74 20 3d 20 28 75 38  K;..  aOut = (u8
24a70 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
24a80 36 34 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20 69 66  64(nAlloc);.  if
24a90 28 20 61 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( aOut==0 ){.   
24aa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24ab0 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
24ac0 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 7a 5f   int res;.    z_
24ad0 73 74 72 65 61 6d 20 73 74 72 3b 0a 20 20 20 20  stream str;.    
24ae0 6d 65 6d 73 65 74 28 26 73 74 72 2c 20 30 2c 20  memset(&str, 0, 
24af0 73 69 7a 65 6f 66 28 73 74 72 29 29 3b 0a 20 20  sizeof(str));.  
24b00 20 20 73 74 72 2e 6e 65 78 74 5f 69 6e 20 3d 20    str.next_in = 
24b10 28 42 79 74 65 66 2a 29 61 49 6e 3b 0a 20 20 20  (Bytef*)aIn;.   
24b20 20 73 74 72 2e 61 76 61 69 6c 5f 69 6e 20 3d 20   str.avail_in = 
24b30 6e 49 6e 3b 0a 20 20 20 20 73 74 72 2e 6e 65 78  nIn;.    str.nex
24b40 74 5f 6f 75 74 20 3d 20 61 4f 75 74 3b 0a 20 20  t_out = aOut;.  
24b50 20 20 73 74 72 2e 61 76 61 69 6c 5f 6f 75 74 20    str.avail_out 
24b60 3d 20 6e 41 6c 6c 6f 63 3b 0a 0a 20 20 20 20 64  = nAlloc;..    d
24b70 65 66 6c 61 74 65 49 6e 69 74 32 28 26 73 74 72  eflateInit2(&str
24b80 2c 20 39 2c 20 5a 5f 44 45 46 4c 41 54 45 44 2c  , 9, Z_DEFLATED,
24b90 20 2d 31 35 2c 20 38 2c 20 5a 5f 44 45 46 41 55   -15, 8, Z_DEFAU
24ba0 4c 54 5f 53 54 52 41 54 45 47 59 29 3b 0a 20 20  LT_STRATEGY);.  
24bb0 20 20 72 65 73 20 3d 20 64 65 66 6c 61 74 65 28    res = deflate(
24bc0 26 73 74 72 2c 20 5a 5f 46 49 4e 49 53 48 29 3b  &str, Z_FINISH);
24bd0 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 5a  ..    if( res==Z
24be0 5f 53 54 52 45 41 4d 5f 45 4e 44 20 29 7b 0a 20  _STREAM_END ){. 
24bf0 20 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 61 4f       *ppOut = aO
24c00 75 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 75 74  ut;.      *pnOut
24c10 20 3d 20 28 69 6e 74 29 73 74 72 2e 74 6f 74 61   = (int)str.tota
24c20 6c 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  l_out;.    }else
24c30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24c40 66 72 65 65 28 61 4f 75 74 29 3b 0a 20 20 20 20  free(aOut);.    
24c50 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74    *pzErr = sqlit
24c60 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70 66  e3_mprintf("zipf
24c70 69 6c 65 3a 20 64 65 66 6c 61 74 65 28 29 20 65  ile: deflate() e
24c80 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 72 63  rror");.      rc
24c90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
24ca0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 6c 61  .    }.    defla
24cb0 74 65 45 6e 64 28 26 73 74 72 29 3b 0a 20 20 7d  teEnd(&str);.  }
24cc0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
24cd0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
24ce0 76 61 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e  values of column
24cf0 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74  s for the row at
24d00 20 77 68 69 63 68 20 74 68 65 20 73 65 72 69 65   which the serie
24d10 73 5f 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63  s_cursor.** is c
24d20 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24d30 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
24d40 20 7a 69 70 66 69 6c 65 43 6f 6c 75 6d 6e 28 0a   zipfileColumn(.
24d50 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
24d60 75 72 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a  ursor *cur,   /*
24d70 20 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20   The cursor */. 
24d80 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
24d90 20 2a 63 74 78 2c 20 20 20 20 20 20 20 2f 2a 20   *ctx,       /* 
24da0 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
24db0 6f 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  o sqlite3_result
24dc0 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  _...() */.  int 
24dd0 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i               
24de0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
24df0 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72   column to retur
24e00 6e 20 2a 2f 0a 29 7b 0a 20 20 5a 69 70 66 69 6c  n */.){.  Zipfil
24e10 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28 5a 69  eCsr *pCsr = (Zi
24e20 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b 0a 20  pfileCsr*)cur;. 
24e30 20 5a 69 70 66 69 6c 65 43 44 53 20 2a 70 43 44   ZipfileCDS *pCD
24e40 53 20 3d 20 26 70 43 73 72 2d 3e 70 43 75 72 72  S = &pCsr->pCurr
24e50 65 6e 74 2d 3e 63 64 73 3b 0a 20 20 69 6e 74 20  ent->cds;.  int 
24e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24e70 20 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20    switch( i ){. 
24e80 20 20 20 63 61 73 65 20 30 3a 20 20 20 2f 2a 20     case 0:   /* 
24e90 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  name */.      sq
24ea0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
24eb0 74 28 63 74 78 2c 20 70 43 44 53 2d 3e 7a 46 69  t(ctx, pCDS->zFi
24ec0 6c 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  le, -1, SQLITE_T
24ed0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
24ee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
24ef0 20 31 3a 20 20 20 2f 2a 20 6d 6f 64 65 20 2a 2f   1:   /* mode */
24f00 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
24f10 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
24f20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
24f30 63 6f 72 72 65 63 74 20 73 75 72 65 6c 79 20 64  correct surely d
24f40 65 70 65 6e 64 73 20 6f 6e 0a 20 20 20 20 20 20  epends on.      
24f50 2a 2a 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20  ** the platform 
24f60 6f 6e 20 77 68 69 63 68 20 74 68 65 20 61 72 63  on which the arc
24f70 68 69 76 65 20 77 61 73 20 63 72 65 61 74 65 64  hive was created
24f80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  .  */.      sqli
24f90 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
24fa0 74 78 2c 20 70 43 44 53 2d 3e 69 45 78 74 65 72  tx, pCDS->iExter
24fb0 6e 61 6c 41 74 74 72 20 3e 3e 20 31 36 29 3b 0a  nalAttr >> 16);.
24fc0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
24fd0 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 6d 74   case 2: { /* mt
24fe0 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ime */.      sql
24ff0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
25000 34 28 63 74 78 2c 20 70 43 73 72 2d 3e 70 43 75  4(ctx, pCsr->pCu
25010 72 72 65 6e 74 2d 3e 6d 55 6e 69 78 54 69 6d 65  rrent->mUnixTime
25020 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
25030 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
25040 3a 20 7b 20 2f 2a 20 73 7a 20 2a 2f 0a 20 20 20  : { /* sz */.   
25050 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
25060 74 61 62 5f 6e 6f 63 68 61 6e 67 65 28 63 74 78  tab_nochange(ctx
25070 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
25080 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
25090 6e 74 36 34 28 63 74 78 2c 20 70 43 44 53 2d 3e  nt64(ctx, pCDS->
250a0 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 29 3b  szUncompressed);
250b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
250c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
250d0 63 61 73 65 20 34 3a 20 20 20 2f 2a 20 72 61 77  case 4:   /* raw
250e0 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 66  data */.      if
250f0 28 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6e  ( sqlite3_vtab_n
25100 6f 63 68 61 6e 67 65 28 63 74 78 29 20 29 20 62  ochange(ctx) ) b
25110 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 35  reak;.    case 5
25120 3a 20 7b 20 2f 2a 20 64 61 74 61 20 2a 2f 0a 20  : { /* data */. 
25130 20 20 20 20 20 69 66 28 20 69 3d 3d 34 20 7c 7c       if( i==4 ||
25140 20 70 43 44 53 2d 3e 69 43 6f 6d 70 72 65 73 73   pCDS->iCompress
25150 69 6f 6e 3d 3d 30 20 7c 7c 20 70 43 44 53 2d 3e  ion==0 || pCDS->
25160 69 43 6f 6d 70 72 65 73 73 69 6f 6e 3d 3d 38 20  iCompression==8 
25170 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
25180 7a 20 3d 20 70 43 44 53 2d 3e 73 7a 43 6f 6d 70  z = pCDS->szComp
25190 72 65 73 73 65 64 3b 0a 20 20 20 20 20 20 20 20  ressed;.        
251a0 69 6e 74 20 73 7a 46 69 6e 61 6c 20 3d 20 70 43  int szFinal = pC
251b0 44 53 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73  DS->szUncompress
251c0 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
251d0 73 7a 46 69 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  szFinal>0 ){.   
251e0 20 20 20 20 20 20 20 75 38 20 2a 61 42 75 66 3b         u8 *aBuf;
251f0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
25200 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
25210 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70 43      if( pCsr->pC
25220 75 72 72 65 6e 74 2d 3e 61 44 61 74 61 20 29 7b  urrent->aData ){
25230 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 42 75  .            aBu
25240 66 20 3d 20 70 43 73 72 2d 3e 70 43 75 72 72 65  f = pCsr->pCurre
25250 6e 74 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nt->aData;.     
25260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25270 20 20 20 20 20 20 20 20 61 42 75 66 20 3d 20 61          aBuf = a
25280 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Free = sqlite3_m
25290 61 6c 6c 6f 63 36 34 28 73 7a 29 3b 0a 20 20 20  alloc64(sz);.   
252a0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
252b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
252c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
252d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
252e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
252f0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 20 2a            FILE *
25300 70 46 69 6c 65 20 3d 20 70 43 73 72 2d 3e 70 46  pFile = pCsr->pF
25310 69 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ile;.           
25320 20 20 20 69 66 28 20 70 46 69 6c 65 3d 3d 30 20     if( pFile==0 
25330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25340 20 20 20 70 46 69 6c 65 20 3d 20 28 28 5a 69 70     pFile = ((Zip
25350 66 69 6c 65 54 61 62 2a 29 28 70 43 73 72 2d 3e  fileTab*)(pCsr->
25360 62 61 73 65 2e 70 56 74 61 62 29 29 2d 3e 70 57  base.pVtab))->pW
25370 72 69 74 65 46 64 3b 0a 20 20 20 20 20 20 20 20  riteFd;.        
25380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25390 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69        rc = zipfi
253a0 6c 65 52 65 61 64 44 61 74 61 28 70 46 69 6c 65  leReadData(pFile
253b0 2c 20 61 42 75 66 2c 20 73 7a 2c 20 70 43 73 72  , aBuf, sz, pCsr
253c0 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 69 44 61 74  ->pCurrent->iDat
253d0 61 4f 66 66 2c 0a 20 20 20 20 20 20 20 20 20 20  aOff,.          
253e0 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e 62          &pCsr->b
253f0 61 73 65 2e 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ase.pVtab->zErrM
25400 73 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  sg.             
25410 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
25420 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
25430 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
25440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25450 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
25460 35 20 26 26 20 70 43 44 53 2d 3e 69 43 6f 6d 70  5 && pCDS->iComp
25470 72 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  ression ){.     
25480 20 20 20 20 20 20 20 20 20 7a 69 70 66 69 6c 65           zipfile
25490 49 6e 66 6c 61 74 65 28 63 74 78 2c 20 61 42 75  Inflate(ctx, aBu
254a0 66 2c 20 73 7a 2c 20 73 7a 46 69 6e 61 6c 29 3b  f, sz, szFinal);
254b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
254c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
254d0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
254e0 5f 62 6c 6f 62 28 63 74 78 2c 20 61 42 75 66 2c  _blob(ctx, aBuf,
254f0 20 73 7a 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   sz, SQLITE_TRAN
25500 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20 20  SIENT);.        
25510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25520 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
25530 74 65 33 5f 66 72 65 65 28 61 46 72 65 65 29 3b  te3_free(aFree);
25540 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67            /* Fig
25560 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20  ure out if this 
25570 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 20 6f  is a directory o
25580 72 20 61 20 7a 65 72 6f 2d 73 69 7a 65 64 20 66  r a zero-sized f
25590 69 6c 65 2e 20 43 6f 6e 73 69 64 65 72 0a 20 20  ile. Consider.  
255a0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74 6f          ** it to
255b0 20 62 65 20 61 20 64 69 72 65 63 74 6f 72 79 20   be a directory 
255c0 65 69 74 68 65 72 20 69 66 20 74 68 65 20 6d 6f  either if the mo
255d0 64 65 20 73 75 67 67 65 73 74 73 20 73 6f 2c 20  de suggests so, 
255e0 6f 72 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  or if.          
255f0 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 63 68 61  ** the final cha
25600 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 6e 61  racter in the na
25610 6d 65 20 69 73 20 27 2f 27 2e 20 20 2a 2f 0a 20  me is '/'.  */. 
25620 20 20 20 20 20 20 20 20 20 75 33 32 20 6d 6f 64           u32 mod
25630 65 20 3d 20 70 43 44 53 2d 3e 69 45 78 74 65 72  e = pCDS->iExter
25640 6e 61 6c 41 74 74 72 20 3e 3e 20 31 36 3b 0a 20  nalAttr >> 16;. 
25650 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6d           if( !(m
25660 6f 64 65 20 26 20 53 5f 49 46 44 49 52 29 20 26  ode & S_IFDIR) &
25670 26 20 70 43 44 53 2d 3e 7a 46 69 6c 65 5b 70 43  & pCDS->zFile[pC
25680 44 53 2d 3e 6e 46 69 6c 65 2d 31 5d 21 3d 27 2f  DS->nFile-1]!='/
25690 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
256a0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
256b0 62 6c 6f 62 28 63 74 78 2c 20 22 22 2c 20 30 2c  blob(ctx, "", 0,
256c0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
256d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
256e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
256f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25700 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
25710 2f 2a 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 20  /* method */.   
25720 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
25730 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 44 53 2d  t_int(ctx, pCDS-
25740 3e 69 43 6f 6d 70 72 65 73 73 69 6f 6e 29 3b 0a  >iCompression);.
25750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25760 20 64 65 66 61 75 6c 74 3a 20 20 2f 2a 20 7a 20   default:  /* z 
25770 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
25780 20 69 3d 3d 37 20 29 3b 0a 20 20 20 20 20 20 73   i==7 );.      s
25790 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
257a0 74 36 34 28 63 74 78 2c 20 70 43 73 72 2d 3e 69  t64(ctx, pCsr->i
257b0 49 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Id);.      break
257c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
257d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
257e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
257f0 63 75 72 73 6f 72 20 69 73 20 61 74 20 45 4f 46  cursor is at EOF
25800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25810 7a 69 70 66 69 6c 65 45 6f 66 28 73 71 6c 69 74  zipfileEof(sqlit
25820 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
25830 63 75 72 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43  cur){.  ZipfileC
25840 73 72 20 2a 70 43 73 72 20 3d 20 28 5a 69 70 66  sr *pCsr = (Zipf
25850 69 6c 65 43 73 72 2a 29 63 75 72 3b 0a 20 20 72  ileCsr*)cur;.  r
25860 65 74 75 72 6e 20 70 43 73 72 2d 3e 62 45 6f 66  eturn pCsr->bEof
25870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 42  ;.}../*.** If aB
25880 6c 6f 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  lob is not NULL,
25890 20 74 68 65 6e 20 69 74 20 70 6f 69 6e 74 73 20   then it points 
258a0 74 6f 20 61 20 62 75 66 66 65 72 20 6e 42 6c 6f  to a buffer nBlo
258b0 62 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 0a  b bytes in size.
258c0 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  ** containing an
258d0 20 65 6e 74 69 72 65 20 7a 69 70 20 61 72 63 68   entire zip arch
258e0 69 76 65 20 69 6d 61 67 65 2e 20 4f 72 2c 20 69  ive image. Or, i
258f0 66 20 61 42 6c 6f 62 20 69 73 20 4e 55 4c 4c 2c  f aBlob is NULL,
25900 20 74 68 65 6e 20 70 46 69 6c 65 0a 2a 2a 20 69   then pFile.** i
25910 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
25920 62 65 20 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65  be a file-handle
25930 20 6f 70 65 6e 20 6f 6e 20 61 20 7a 69 70 20 66   open on a zip f
25940 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
25950 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
25960 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
25970 45 4f 43 44 20 72 65 63 6f 72 64 20 77 69 74 68  EOCD record with
25980 69 6e 20 74 68 65 20 7a 69 70 20 61 72 63 68 69  in the zip archi
25990 76 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  ve.** and popula
259a0 74 65 20 2a 70 45 4f 43 44 20 77 69 74 68 20 74  te *pEOCD with t
259b0 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 64 65  he results of de
259c0 63 6f 64 69 6e 67 20 69 74 2e 20 53 51 4c 49 54  coding it. SQLIT
259d0 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
259e0 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
259f0 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  l. Otherwise, an
25a00 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25a10 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
25a20 6e 64 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68  nd.** an English
25a30 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
25a40 6d 65 73 73 61 67 65 20 6d 61 79 20 62 65 20 6c  message may be l
25a50 65 66 74 20 69 6e 20 76 69 72 74 75 61 6c 2d 74  eft in virtual-t
25a60 61 62 6c 65 20 70 54 61 62 2e 0a 2a 2f 0a 73 74  able pTab..*/.st
25a70 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
25a80 52 65 61 64 45 4f 43 44 28 0a 20 20 5a 69 70 66  ReadEOCD(.  Zipf
25a90 69 6c 65 54 61 62 20 2a 70 54 61 62 2c 20 20 20  ileTab *pTab,   
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25ab0 65 74 75 72 6e 20 65 72 72 6f 72 73 20 68 65 72  eturn errors her
25ac0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  e */.  const u8 
25ad0 2a 61 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20  *aBlob,         
25ae0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
25af0 72 20 74 6f 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  r to in-memory f
25b00 69 6c 65 20 69 6d 61 67 65 20 2a 2f 0a 20 20 69  ile image */.  i
25b10 6e 74 20 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20  nt nBlob,       
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b30 2a 20 53 69 7a 65 20 6f 66 20 61 42 6c 6f 62 5b  * Size of aBlob[
25b40 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
25b50 46 49 4c 45 20 2a 70 46 69 6c 65 2c 20 20 20 20  FILE *pFile,    
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b70 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20 74 68 69  /* Read from thi
25b80 73 20 66 69 6c 65 20 69 66 20 61 42 6c 6f 62 3d  s file if aBlob=
25b90 3d 30 20 2a 2f 0a 20 20 5a 69 70 66 69 6c 65 45  =0 */.  ZipfileE
25ba0 4f 43 44 20 2a 70 45 4f 43 44 20 20 20 20 20 20  OCD *pEOCD      
25bb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
25bc0 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
25bd0 0a 29 7b 0a 20 20 75 38 20 2a 61 52 65 61 64 20  .){.  u8 *aRead 
25be0 3d 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72 3b  = pTab->aBuffer;
25bf0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
25c00 72 79 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ry buffer */.  i
25c10 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
25c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c30 2a 20 42 79 74 65 73 20 74 6f 20 72 65 61 64 20  * Bytes to read 
25c40 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69  from file */.  i
25c50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25c60 4b 3b 0a 0a 20 20 69 66 28 20 61 42 6c 6f 62 3d  K;..  if( aBlob=
25c70 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f  =0 ){.    i64 iO
25c80 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
25c90 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
25ca0 74 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  t to read from *
25cb0 2f 0a 20 20 20 20 69 36 34 20 73 7a 46 69 6c 65  /.    i64 szFile
25cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25cd0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
25ce0 65 20 6f 66 20 66 69 6c 65 20 69 6e 20 62 79 74  e of file in byt
25cf0 65 73 20 2a 2f 0a 20 20 20 20 66 73 65 65 6b 28  es */.    fseek(
25d00 70 46 69 6c 65 2c 20 30 2c 20 53 45 45 4b 5f 45  pFile, 0, SEEK_E
25d10 4e 44 29 3b 0a 20 20 20 20 73 7a 46 69 6c 65 20  ND);.    szFile 
25d20 3d 20 28 69 36 34 29 66 74 65 6c 6c 28 70 46 69  = (i64)ftell(pFi
25d30 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 46  le);.    if( szF
25d40 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
25d50 6d 65 6d 73 65 74 28 70 45 4f 43 44 2c 20 30 2c  memset(pEOCD, 0,
25d60 20 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c 65 45   sizeof(ZipfileE
25d70 4f 43 44 29 29 3b 0a 20 20 20 20 20 20 72 65 74  OCD));.      ret
25d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25d90 20 20 20 7d 0a 20 20 20 20 6e 52 65 61 64 20 3d     }.    nRead =
25da0 20 28 69 6e 74 29 28 4d 49 4e 28 73 7a 46 69 6c   (int)(MIN(szFil
25db0 65 2c 20 5a 49 50 46 49 4c 45 5f 42 55 46 46 45  e, ZIPFILE_BUFFE
25dc0 52 5f 53 49 5a 45 29 29 3b 0a 20 20 20 20 69 4f  R_SIZE));.    iO
25dd0 66 66 20 3d 20 73 7a 46 69 6c 65 20 2d 20 6e 52  ff = szFile - nR
25de0 65 61 64 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69  ead;.    rc = zi
25df0 70 66 69 6c 65 52 65 61 64 44 61 74 61 28 70 46  pfileReadData(pF
25e00 69 6c 65 2c 20 61 52 65 61 64 2c 20 6e 52 65 61  ile, aRead, nRea
25e10 64 2c 20 69 4f 66 66 2c 20 26 70 54 61 62 2d 3e  d, iOff, &pTab->
25e20 62 61 73 65 2e 7a 45 72 72 4d 73 67 29 3b 0a 20  base.zErrMsg);. 
25e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 61   }else{.    nRea
25e40 64 20 3d 20 28 69 6e 74 29 28 4d 49 4e 28 6e 42  d = (int)(MIN(nB
25e50 6c 6f 62 2c 20 5a 49 50 46 49 4c 45 5f 42 55 46  lob, ZIPFILE_BUF
25e60 46 45 52 5f 53 49 5a 45 29 29 3b 0a 20 20 20 20  FER_SIZE));.    
25e70 61 52 65 61 64 20 3d 20 28 75 38 2a 29 26 61 42  aRead = (u8*)&aB
25e80 6c 6f 62 5b 6e 42 6c 6f 62 2d 6e 52 65 61 64 5d  lob[nBlob-nRead]
25e90 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
25ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25eb0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a    int i;..    /*
25ec0 20 53 63 61 6e 20 62 61 63 6b 77 61 72 64 73 20   Scan backwards 
25ed0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  looking for the 
25ee0 73 69 67 6e 61 74 75 72 65 20 62 79 74 65 73 20  signature bytes 
25ef0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65  */.    for(i=nRe
25f00 61 64 2d 32 30 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ad-20; i>=0; i--
25f10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 52 65  ){.      if( aRe
25f20 61 64 5b 69 5d 3d 3d 30 78 35 30 20 26 26 20 61  ad[i]==0x50 && a
25f30 52 65 61 64 5b 69 2b 31 5d 3d 3d 30 78 34 62 20  Read[i+1]==0x4b 
25f40 0a 20 20 20 20 20 20 20 26 26 20 61 52 65 61 64  .       && aRead
25f50 5b 69 2b 32 5d 3d 3d 30 78 30 35 20 26 26 20 61  [i+2]==0x05 && a
25f60 52 65 61 64 5b 69 2b 33 5d 3d 3d 30 78 30 36 20  Read[i+3]==0x06 
25f70 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
25f80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
25fa0 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  <0 ){.      pTab
25fb0 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d  ->base.zErrMsg =
25fc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
25fd0 28 0a 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  (.          "can
25fe0 6e 6f 74 20 66 69 6e 64 20 65 6e 64 20 6f 66 20  not find end of 
25ff0 63 65 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72  central director
26000 79 20 72 65 63 6f 72 64 22 0a 20 20 20 20 20 20  y record".      
26010 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26020 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
26030 20 20 7d 0a 0a 20 20 20 20 61 52 65 61 64 20 2b    }..    aRead +
26040 3d 20 69 2b 34 3b 0a 20 20 20 20 70 45 4f 43 44  = i+4;.    pEOCD
26050 2d 3e 69 44 69 73 6b 20 3d 20 7a 69 70 66 69 6c  ->iDisk = zipfil
26060 65 52 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a  eRead16(aRead);.
26070 20 20 20 20 70 45 4f 43 44 2d 3e 69 46 69 72 73      pEOCD->iFirs
26080 74 44 69 73 6b 20 3d 20 7a 69 70 66 69 6c 65 52  tDisk = zipfileR
26090 65 61 64 31 36 28 61 52 65 61 64 29 3b 0a 20 20  ead16(aRead);.  
260a0 20 20 70 45 4f 43 44 2d 3e 6e 45 6e 74 72 79 20    pEOCD->nEntry 
260b0 3d 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28  = zipfileRead16(
260c0 61 52 65 61 64 29 3b 0a 20 20 20 20 70 45 4f 43  aRead);.    pEOC
260d0 44 2d 3e 6e 45 6e 74 72 79 54 6f 74 61 6c 20 3d  D->nEntryTotal =
260e0 20 7a 69 70 66 69 6c 65 52 65 61 64 31 36 28 61   zipfileRead16(a
260f0 52 65 61 64 29 3b 0a 20 20 20 20 70 45 4f 43 44  Read);.    pEOCD
26100 2d 3e 6e 53 69 7a 65 20 3d 20 7a 69 70 66 69 6c  ->nSize = zipfil
26110 65 52 65 61 64 33 32 28 61 52 65 61 64 29 3b 0a  eRead32(aRead);.
26120 20 20 20 20 70 45 4f 43 44 2d 3e 69 4f 66 66 73      pEOCD->iOffs
26130 65 74 20 3d 20 7a 69 70 66 69 6c 65 52 65 61 64  et = zipfileRead
26140 33 32 28 61 52 65 61 64 29 3b 0a 20 20 7d 0a 0a  32(aRead);.  }..
26150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26160 2f 2a 0a 2a 2a 20 41 64 64 20 6f 62 6a 65 63 74  /*.** Add object
26170 20 70 4e 65 77 20 74 6f 20 74 68 65 20 6c 69 6e   pNew to the lin
26180 6b 65 64 20 6c 69 73 74 20 74 68 61 74 20 62 65  ked list that be
26190 67 69 6e 73 20 61 74 20 5a 69 70 66 69 6c 65 54  gins at ZipfileT
261a0 61 62 2e 70 46 69 72 73 74 45 6e 74 72 79 20 0a  ab.pFirstEntry .
261b0 2a 2a 20 61 6e 64 20 65 6e 64 73 20 77 69 74 68  ** and ends with
261c0 20 70 4c 61 73 74 45 6e 74 72 79 2e 20 49 66 20   pLastEntry. If 
261d0 61 72 67 75 6d 65 6e 74 20 70 42 65 66 6f 72 65  argument pBefore
261e0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
261f0 4e 65 77 20 69 73 20 61 64 64 65 64 0a 2a 2a 20  New is added.** 
26200 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
26210 65 20 6c 69 73 74 2e 20 4f 74 68 65 72 77 69 73  e list. Otherwis
26220 65 2c 20 69 74 20 69 73 20 61 64 64 65 64 20 74  e, it is added t
26230 6f 20 74 68 65 20 6c 69 73 74 20 69 6d 6d 65 64  o the list immed
26240 69 61 74 65 6c 79 0a 2a 2a 20 62 65 66 6f 72 65  iately.** before
26250 20 70 42 65 66 6f 72 65 20 28 77 68 69 63 68 20   pBefore (which 
26260 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
26270 20 62 65 20 61 20 70 61 72 74 20 6f 66 20 73 61   be a part of sa
26280 69 64 20 6c 69 73 74 29 2e 0a 2a 2f 0a 73 74 61  id list)..*/.sta
26290 74 69 63 20 76 6f 69 64 20 7a 69 70 66 69 6c 65  tic void zipfile
262a0 41 64 64 45 6e 74 72 79 28 0a 20 20 5a 69 70 66  AddEntry(.  Zipf
262b0 69 6c 65 54 61 62 20 2a 70 54 61 62 2c 20 0a 20  ileTab *pTab, . 
262c0 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70   ZipfileEntry *p
262d0 42 65 66 6f 72 65 2c 20 0a 20 20 5a 69 70 66 69  Before, .  Zipfi
262e0 6c 65 45 6e 74 72 79 20 2a 70 4e 65 77 0a 29 7b  leEntry *pNew.){
262f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 61 62  .  assert( (pTab
26300 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3d 3d 30  ->pFirstEntry==0
26310 29 3d 3d 28 70 54 61 62 2d 3e 70 4c 61 73 74 45  )==(pTab->pLastE
26320 6e 74 72 79 3d 3d 30 29 20 29 3b 0a 20 20 61 73  ntry==0) );.  as
26330 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4e 65 78  sert( pNew->pNex
26340 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 42  t==0 );.  if( pB
26350 65 66 6f 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  efore==0 ){.    
26360 69 66 28 20 70 54 61 62 2d 3e 70 46 69 72 73 74  if( pTab->pFirst
26370 45 6e 74 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20  Entry==0 ){.    
26380 20 20 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e    pTab->pFirstEn
26390 74 72 79 20 3d 20 70 54 61 62 2d 3e 70 4c 61 73  try = pTab->pLas
263a0 74 45 6e 74 72 79 20 3d 20 70 4e 65 77 3b 0a 20  tEntry = pNew;. 
263b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
263c0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70 4c  assert( pTab->pL
263d0 61 73 74 45 6e 74 72 79 2d 3e 70 4e 65 78 74 3d  astEntry->pNext=
263e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
263f0 2d 3e 70 4c 61 73 74 45 6e 74 72 79 2d 3e 70 4e  ->pLastEntry->pN
26400 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ext = pNew;.    
26410 20 20 70 54 61 62 2d 3e 70 4c 61 73 74 45 6e 74    pTab->pLastEnt
26420 72 79 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  ry = pNew;.    }
26430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 5a 69  .  }else{.    Zi
26440 70 66 69 6c 65 45 6e 74 72 79 20 2a 2a 70 70 3b  pfileEntry **pp;
26450 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 54 61  .    for(pp=&pTa
26460 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3b 20  b->pFirstEntry; 
26470 2a 70 70 21 3d 70 42 65 66 6f 72 65 3b 20 70 70  *pp!=pBefore; pp
26480 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
26490 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65  );.    pNew->pNe
264a0 78 74 20 3d 20 70 42 65 66 6f 72 65 3b 0a 20 20  xt = pBefore;.  
264b0 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
264c0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
264d0 7a 69 70 66 69 6c 65 4c 6f 61 64 44 69 72 65 63  zipfileLoadDirec
264e0 74 6f 72 79 28 5a 69 70 66 69 6c 65 54 61 62 20  tory(ZipfileTab 
264f0 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 75 38 20  *pTab, const u8 
26500 2a 61 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *aBlob, int nBlo
26510 62 29 7b 0a 20 20 5a 69 70 66 69 6c 65 45 4f 43  b){.  ZipfileEOC
26520 44 20 65 6f 63 64 3b 0a 20 20 69 6e 74 20 72 63  D eocd;.  int rc
26530 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 36 34  ;.  int i;.  i64
26540 20 69 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 7a   iOff;..  rc = z
26550 69 70 66 69 6c 65 52 65 61 64 45 4f 43 44 28 70  ipfileReadEOCD(p
26560 54 61 62 2c 20 61 42 6c 6f 62 2c 20 6e 42 6c 6f  Tab, aBlob, nBlo
26570 62 2c 20 70 54 61 62 2d 3e 70 57 72 69 74 65 46  b, pTab->pWriteF
26580 64 2c 20 26 65 6f 63 64 29 3b 0a 20 20 69 4f 66  d, &eocd);.  iOf
26590 66 20 3d 20 65 6f 63 64 2e 69 4f 66 66 73 65 74  f = eocd.iOffset
265a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
265b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
265c0 65 6f 63 64 2e 6e 45 6e 74 72 79 3b 20 69 2b 2b  eocd.nEntry; i++
265d0 29 7b 0a 20 20 20 20 5a 69 70 66 69 6c 65 45 6e  ){.    ZipfileEn
265e0 74 72 79 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  try *pNew = 0;. 
265f0 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 47     rc = zipfileG
26600 65 74 45 6e 74 72 79 28 70 54 61 62 2c 20 61 42  etEntry(pTab, aB
26610 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 70 54 61 62  lob, nBlob, pTab
26620 2d 3e 70 57 72 69 74 65 46 64 2c 20 69 4f 66 66  ->pWriteFd, iOff
26630 2c 20 26 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  , &pNew);..    i
26640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26650 20 29 7b 0a 20 20 20 20 20 20 7a 69 70 66 69 6c   ){.      zipfil
26660 65 41 64 64 45 6e 74 72 79 28 70 54 61 62 2c 20  eAddEntry(pTab, 
26670 30 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  0, pNew);.      
26680 69 4f 66 66 20 2b 3d 20 5a 49 50 46 49 4c 45 5f  iOff += ZIPFILE_
26690 43 44 53 5f 46 49 58 45 44 5f 53 5a 3b 0a 20 20  CDS_FIXED_SZ;.  
266a0 20 20 20 20 69 4f 66 66 20 2b 3d 20 28 69 6e 74      iOff += (int
266b0 29 70 4e 65 77 2d 3e 63 64 73 2e 6e 45 78 74 72  )pNew->cds.nExtr
266c0 61 20 2b 20 70 4e 65 77 2d 3e 63 64 73 2e 6e 46  a + pNew->cds.nF
266d0 69 6c 65 20 2b 20 70 4e 65 77 2d 3e 63 64 73 2e  ile + pNew->cds.
266e0 6e 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 7d 0a  nComment;.    }.
266f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 46 69 6c 74 65  .}../*.** xFilte
26710 72 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  r callback..*/.s
26720 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c  tatic int zipfil
26730 65 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  eFilter(.  sqlit
26740 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
26750 63 75 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e  cur, .  int idxN
26760 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  um, const char *
26770 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72  idxStr,.  int ar
26780 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
26790 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 5a 69  e **argv.){.  Zi
267a0 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 20 3d  pfileTab *pTab =
267b0 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 63 75   (ZipfileTab*)cu
267c0 72 2d 3e 70 56 74 61 62 3b 0a 20 20 5a 69 70 66  r->pVtab;.  Zipf
267d0 69 6c 65 43 73 72 20 2a 70 43 73 72 20 3d 20 28  ileCsr *pCsr = (
267e0 5a 69 70 66 69 6c 65 43 73 72 2a 29 63 75 72 3b  ZipfileCsr*)cur;
267f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26800 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
26810 20 20 20 2f 2a 20 5a 69 70 20 66 69 6c 65 20 74     /* Zip file t
26820 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e 74 20  o scan */.  int 
26830 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
26840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26850 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
26860 69 6e 74 20 62 49 6e 4d 65 6d 6f 72 79 20 3d 20  int bInMemory = 
26870 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
26880 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 6e 20 69  /* True for an i
26890 6e 2d 6d 65 6d 6f 72 79 20 7a 69 70 66 69 6c 65  n-memory zipfile
268a0 20 2a 2f 0a 0a 20 20 7a 69 70 66 69 6c 65 52 65   */..  zipfileRe
268b0 73 65 74 43 75 72 73 6f 72 28 70 43 73 72 29 3b  setCursor(pCsr);
268c0 0a 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 7a 46  ..  if( pTab->zF
268d0 69 6c 65 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65  ile ){.    zFile
268e0 20 3d 20 70 54 61 62 2d 3e 7a 46 69 6c 65 3b 0a   = pTab->zFile;.
268f0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78 4e    }else if( idxN
26900 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 69 70  um==0 ){.    zip
26910 66 69 6c 65 43 75 72 73 6f 72 45 72 72 28 70 43  fileCursorErr(pC
26920 73 72 2c 20 22 7a 69 70 66 69 6c 65 28 29 20 66  sr, "zipfile() f
26930 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65 73  unction requires
26940 20 61 6e 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a   an argument");.
26950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26960 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
26970 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
26980 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
26990 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b  ==SQLITE_BLOB ){
269a0 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  .    const u8 *a
269b0 42 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 75 38  Blob = (const u8
269c0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
269d0 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
269e0 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
269f0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
26a00 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
26a10 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 70   assert( pTab->p
26a20 46 69 72 73 74 45 6e 74 72 79 3d 3d 30 20 29 3b  FirstEntry==0 );
26a30 0a 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c  .    rc = zipfil
26a40 65 4c 6f 61 64 44 69 72 65 63 74 6f 72 79 28 70  eLoadDirectory(p
26a50 54 61 62 2c 20 61 42 6c 6f 62 2c 20 6e 42 6c 6f  Tab, aBlob, nBlo
26a60 62 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 46  b);.    pCsr->pF
26a70 72 65 65 45 6e 74 72 79 20 3d 20 70 54 61 62 2d  reeEntry = pTab-
26a80 3e 70 46 69 72 73 74 45 6e 74 72 79 3b 0a 20 20  >pFirstEntry;.  
26a90 20 20 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e    pTab->pFirstEn
26aa0 74 72 79 20 3d 20 70 54 61 62 2d 3e 70 4c 61 73  try = pTab->pLas
26ab0 74 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20 20 20  tEntry = 0;.    
26ac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26ad0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
26ae0 20 20 20 62 49 6e 4d 65 6d 6f 72 79 20 3d 20 31     bInMemory = 1
26af0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
26b00 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
26b10 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
26b20 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
26b30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d 70  .  }..  if( 0==p
26b40 54 61 62 2d 3e 70 57 72 69 74 65 46 64 20 26 26  Tab->pWriteFd &&
26b50 20 30 3d 3d 62 49 6e 4d 65 6d 6f 72 79 20 29 7b   0==bInMemory ){
26b60 0a 20 20 20 20 70 43 73 72 2d 3e 70 46 69 6c 65  .    pCsr->pFile
26b70 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20   = fopen(zFile, 
26b80 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 70  "rb");.    if( p
26b90 43 73 72 2d 3e 70 46 69 6c 65 3d 3d 30 20 29 7b  Csr->pFile==0 ){
26ba0 0a 20 20 20 20 20 20 7a 69 70 66 69 6c 65 43 75  .      zipfileCu
26bb0 72 73 6f 72 45 72 72 28 70 43 73 72 2c 20 22 63  rsorErr(pCsr, "c
26bc0 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
26bd0 20 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20   %s", zFile);.  
26be0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26bf0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
26c00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70  {.      rc = zip
26c10 66 69 6c 65 52 65 61 64 45 4f 43 44 28 70 54 61  fileReadEOCD(pTa
26c20 62 2c 20 30 2c 20 30 2c 20 70 43 73 72 2d 3e 70  b, 0, 0, pCsr->p
26c30 46 69 6c 65 2c 20 26 70 43 73 72 2d 3e 65 6f 63  File, &pCsr->eoc
26c40 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
26c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26c60 20 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d         if( pCsr-
26c70 3e 65 6f 63 64 2e 6e 45 6e 74 72 79 3d 3d 30 20  >eocd.nEntry==0 
26c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73  ){.          pCs
26c90 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  r->bEof = 1;.   
26ca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26cb0 20 20 20 20 20 20 70 43 73 72 2d 3e 69 4e 65 78        pCsr->iNex
26cc0 74 4f 66 66 20 3d 20 70 43 73 72 2d 3e 65 6f 63  tOff = pCsr->eoc
26cd0 64 2e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  d.iOffset;.     
26ce0 20 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c       rc = zipfil
26cf0 65 4e 65 78 74 28 63 75 72 29 3b 0a 20 20 20 20  eNext(cur);.    
26d00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26d10 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
26d20 20 70 43 73 72 2d 3e 62 4e 6f 6f 70 20 3d 20 31   pCsr->bNoop = 1
26d30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 43 75 72  ;.    pCsr->pCur
26d40 72 65 6e 74 20 3d 20 70 43 73 72 2d 3e 70 46 72  rent = pCsr->pFr
26d50 65 65 45 6e 74 72 79 20 3f 20 70 43 73 72 2d 3e  eeEntry ? pCsr->
26d60 70 46 72 65 65 45 6e 74 72 79 20 3a 20 70 54 61  pFreeEntry : pTa
26d70 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 3b 0a  b->pFirstEntry;.
26d80 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65      rc = zipfile
26d90 4e 65 78 74 28 63 75 72 29 3b 0a 20 20 7d 0a 0a  Next(cur);.  }..
26da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26db0 2f 2a 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  /*.** xBestIndex
26dc0 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   callback..*/.st
26dd0 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
26de0 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c  BestIndex(.  sql
26df0 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a  ite3_vtab *tab,.
26e00 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
26e10 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29  info *pIdxInfo.)
26e20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
26e30 20 69 64 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74   idx = -1;.  int
26e40 20 75 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 0a   unusable = 0;..
26e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
26e60 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
26e70 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  nt; i++){.    co
26e80 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
26e90 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
26ea0 69 6e 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49  int *pCons = &pI
26eb0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
26ec0 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
26ed0 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pCons->iColumn!=
26ee0 5a 49 50 46 49 4c 45 5f 46 5f 43 4f 4c 55 4d 4e  ZIPFILE_F_COLUMN
26ef0 5f 49 44 58 20 29 20 63 6f 6e 74 69 6e 75 65 3b  _IDX ) continue;
26f00 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e  .    if( pCons->
26f10 75 73 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  usable==0 ){.   
26f20 20 20 20 75 6e 75 73 61 62 6c 65 20 3d 20 31 3b     unusable = 1;
26f30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
26f40 43 6f 6e 73 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  Cons->op==SQLITE
26f50 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
26f60 54 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 69 64  T_EQ ){.      id
26f70 78 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = i;.    }.  }
26f80 0a 20 20 69 66 28 20 69 64 78 3e 3d 30 20 29 7b  .  if( idx>=0 ){
26f90 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
26fa0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
26fb0 69 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  idx].argvIndex =
26fc0 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
26fd0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
26fe0 67 65 5b 69 64 78 5d 2e 6f 6d 69 74 20 3d 20 31  ge[idx].omit = 1
26ff0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
27000 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
27010 31 30 30 30 2e 30 3b 0a 20 20 20 20 70 49 64 78  1000.0;.    pIdx
27020 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31  Info->idxNum = 1
27030 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 75 6e  ;.  }else if( un
27040 75 73 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65  usable ){.    re
27050 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
27060 54 52 41 49 4e 54 3b 0a 20 20 7d 0a 20 20 72 65  TRAINT;.  }.  re
27070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27080 7d 0a 0a 73 74 61 74 69 63 20 5a 69 70 66 69 6c  }..static Zipfil
27090 65 45 6e 74 72 79 20 2a 7a 69 70 66 69 6c 65 4e  eEntry *zipfileN
270a0 65 77 45 6e 74 72 79 28 63 6f 6e 73 74 20 63 68  ewEntry(const ch
270b0 61 72 20 2a 7a 50 61 74 68 29 7b 0a 20 20 5a 69  ar *zPath){.  Zi
270c0 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4e 65 77  pfileEntry *pNew
270d0 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
270e0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
270f0 28 5a 69 70 66 69 6c 65 45 6e 74 72 79 29 29 3b  (ZipfileEntry));
27100 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
27110 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
27120 30 2c 20 73 69 7a 65 6f 66 28 5a 69 70 66 69 6c  0, sizeof(Zipfil
27130 65 45 6e 74 72 79 29 29 3b 0a 20 20 20 20 70 4e  eEntry));.    pN
27140 65 77 2d 3e 63 64 73 2e 7a 46 69 6c 65 20 3d 20  ew->cds.zFile = 
27150 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
27160 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  "%s", zPath);.  
27170 20 20 69 66 28 20 70 4e 65 77 2d 3e 63 64 73 2e    if( pNew->cds.
27180 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
27190 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
271a0 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
271b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
271c0 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
271d0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70  ..static int zip
271e0 66 69 6c 65 53 65 72 69 61 6c 69 7a 65 4c 46 48  fileSerializeLFH
271f0 28 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70  (ZipfileEntry *p
27200 45 6e 74 72 79 2c 20 75 38 20 2a 61 42 75 66 29  Entry, u8 *aBuf)
27210 7b 0a 20 20 5a 69 70 66 69 6c 65 43 44 53 20 2a  {.  ZipfileCDS *
27220 70 43 64 73 20 3d 20 26 70 45 6e 74 72 79 2d 3e  pCds = &pEntry->
27230 63 64 73 3b 0a 20 20 75 38 20 2a 61 20 3d 20 61  cds;.  u8 *a = a
27240 42 75 66 3b 0a 0a 20 20 70 43 64 73 2d 3e 6e 45  Buf;..  pCds->nE
27250 78 74 72 61 20 3d 20 39 3b 0a 0a 20 20 2f 2a 20  xtra = 9;..  /* 
27260 57 72 69 74 65 20 74 68 65 20 4c 46 48 20 69 74  Write the LFH it
27270 73 65 6c 66 20 2a 2f 0a 20 20 7a 69 70 66 69 6c  self */.  zipfil
27280 65 57 72 69 74 65 33 32 28 61 2c 20 5a 49 50 46  eWrite32(a, ZIPF
27290 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f 4c 46  ILE_SIGNATURE_LF
272a0 48 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69  H);.  zipfileWri
272b0 74 65 31 36 28 61 2c 20 70 43 64 73 2d 3e 69 56  te16(a, pCds->iV
272c0 65 72 73 69 6f 6e 45 78 74 72 61 63 74 29 3b 0a  ersionExtract);.
272d0 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
272e0 28 61 2c 20 70 43 64 73 2d 3e 66 6c 61 67 73 29  (a, pCds->flags)
272f0 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
27300 31 36 28 61 2c 20 70 43 64 73 2d 3e 69 43 6f 6d  16(a, pCds->iCom
27310 70 72 65 73 73 69 6f 6e 29 3b 0a 20 20 7a 69 70  pression);.  zip
27320 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70  fileWrite16(a, p
27330 43 64 73 2d 3e 6d 54 69 6d 65 29 3b 0a 20 20 7a  Cds->mTime);.  z
27340 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c  ipfileWrite16(a,
27350 20 70 43 64 73 2d 3e 6d 44 61 74 65 29 3b 0a 20   pCds->mDate);. 
27360 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32 28   zipfileWrite32(
27370 61 2c 20 70 43 64 73 2d 3e 63 72 63 33 32 29 3b  a, pCds->crc32);
27380 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33  .  zipfileWrite3
27390 32 28 61 2c 20 70 43 64 73 2d 3e 73 7a 43 6f 6d  2(a, pCds->szCom
273a0 70 72 65 73 73 65 64 29 3b 0a 20 20 7a 69 70 66  pressed);.  zipf
273b0 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 70 43  ileWrite32(a, pC
273c0 64 73 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73  ds->szUncompress
273d0 65 64 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72  ed);.  zipfileWr
273e0 69 74 65 31 36 28 61 2c 20 28 75 31 36 29 70 43  ite16(a, (u16)pC
273f0 64 73 2d 3e 6e 46 69 6c 65 29 3b 0a 20 20 7a 69  ds->nFile);.  zi
27400 70 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20  pfileWrite16(a, 
27410 70 43 64 73 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  pCds->nExtra);. 
27420 20 61 73 73 65 72 74 28 20 61 3d 3d 26 61 42 75   assert( a==&aBu
27430 66 5b 5a 49 50 46 49 4c 45 5f 4c 46 48 5f 46 49  f[ZIPFILE_LFH_FI
27440 58 45 44 5f 53 5a 5d 20 29 3b 0a 0a 20 20 2f 2a  XED_SZ] );..  /*
27450 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 6e 61   Add the file na
27460 6d 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 61  me */.  memcpy(a
27470 2c 20 70 43 64 73 2d 3e 7a 46 69 6c 65 2c 20 28  , pCds->zFile, (
27480 69 6e 74 29 70 43 64 73 2d 3e 6e 46 69 6c 65 29  int)pCds->nFile)
27490 3b 0a 20 20 61 20 2b 3d 20 28 69 6e 74 29 70 43  ;.  a += (int)pC
274a0 64 73 2d 3e 6e 46 69 6c 65 3b 0a 0a 20 20 2f 2a  ds->nFile;..  /*
274b0 20 54 68 65 20 22 65 78 74 72 61 22 20 64 61 74   The "extra" dat
274c0 61 20 2a 2f 0a 20 20 7a 69 70 66 69 6c 65 57 72  a */.  zipfileWr
274d0 69 74 65 31 36 28 61 2c 20 5a 49 50 46 49 4c 45  ite16(a, ZIPFILE
274e0 5f 45 58 54 52 41 5f 54 49 4d 45 53 54 41 4d 50  _EXTRA_TIMESTAMP
274f0 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74  );.  zipfileWrit
27500 65 31 36 28 61 2c 20 35 29 3b 0a 20 20 2a 61 2b  e16(a, 5);.  *a+
27510 2b 20 3d 20 30 78 30 31 3b 0a 20 20 7a 69 70 66  + = 0x01;.  zipf
27520 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 70 45  ileWrite32(a, pE
27530 6e 74 72 79 2d 3e 6d 55 6e 69 78 54 69 6d 65 29  ntry->mUnixTime)
27540 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 2d 61 42  ;..  return a-aB
27550 75 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  uf;.}..static in
27560 74 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 45  t zipfileAppendE
27570 6e 74 72 79 28 0a 20 20 5a 69 70 66 69 6c 65 54  ntry(.  ZipfileT
27580 61 62 20 2a 70 54 61 62 2c 0a 20 20 5a 69 70 66  ab *pTab,.  Zipf
27590 69 6c 65 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  ileEntry *pEntry
275a0 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  ,.  const u8 *pD
275b0 61 74 61 2c 0a 20 20 69 6e 74 20 6e 44 61 74 61  ata,.  int nData
275c0 0a 29 7b 0a 20 20 75 38 20 2a 61 42 75 66 20 3d  .){.  u8 *aBuf =
275d0 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72 3b 0a   pTab->aBuffer;.
275e0 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20 69 6e    int nBuf;.  in
275f0 74 20 72 63 3b 0a 0a 20 20 6e 42 75 66 20 3d 20  t rc;..  nBuf = 
27600 7a 69 70 66 69 6c 65 53 65 72 69 61 6c 69 7a 65  zipfileSerialize
27610 4c 46 48 28 70 45 6e 74 72 79 2c 20 61 42 75 66  LFH(pEntry, aBuf
27620 29 3b 0a 20 20 72 63 20 3d 20 7a 69 70 66 69 6c  );.  rc = zipfil
27630 65 41 70 70 65 6e 64 44 61 74 61 28 70 54 61 62  eAppendData(pTab
27640 2c 20 61 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , aBuf, nBuf);. 
27650 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27660 4f 4b 20 29 7b 0a 20 20 20 20 70 45 6e 74 72 79  OK ){.    pEntry
27670 2d 3e 69 44 61 74 61 4f 66 66 20 3d 20 70 54 61  ->iDataOff = pTa
27680 62 2d 3e 73 7a 43 75 72 72 65 6e 74 3b 0a 20 20  b->szCurrent;.  
27690 20 20 72 63 20 3d 20 7a 69 70 66 69 6c 65 41 70    rc = zipfileAp
276a0 70 65 6e 64 44 61 74 61 28 70 54 61 62 2c 20 70  pendData(pTab, p
276b0 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
276c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
276d0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69  }..static int zi
276e0 70 66 69 6c 65 47 65 74 4d 6f 64 65 28 0a 20 20  pfileGetMode(.  
276f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
27700 56 61 6c 2c 20 0a 20 20 69 6e 74 20 62 49 73 44  Val, .  int bIsD
27710 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ir,             
27720 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
27730 75 65 2c 20 64 65 66 61 75 6c 74 20 74 6f 20 64  ue, default to d
27740 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 75 33  irectory */.  u3
27750 32 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  2 *pMode,       
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27770 20 4f 55 54 3a 20 4d 6f 64 65 20 76 61 6c 75 65   OUT: Mode value
27780 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
27790 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
277a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
277b0 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 29  ror message */.)
277c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
277d0 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
277e0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
277f0 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 75 33 32  ext(pVal);.  u32
27800 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 69 66 28   mode = 0;.  if(
27810 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 6f 64   z==0 ){.    mod
27820 65 20 3d 20 28 62 49 73 44 69 72 20 3f 20 28 53  e = (bIsDir ? (S
27830 5f 49 46 44 49 52 20 2b 20 30 37 35 35 29 20 3a  _IFDIR + 0755) :
27840 20 28 53 5f 49 46 52 45 47 20 2b 20 30 36 34 34   (S_IFREG + 0644
27850 29 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ));.  }else if( 
27860 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
27870 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 6d 6f  ]<='9' ){.    mo
27880 64 65 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69  de = (unsigned i
27890 6e 74 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt)sqlite3_value
278a0 5f 69 6e 74 28 70 56 61 6c 29 3b 0a 20 20 7d 65  _int(pVal);.  }e
278b0 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  lse{.    const c
278c0 68 61 72 20 7a 54 65 6d 70 6c 61 74 65 5b 31 31  har zTemplate[11
278d0 5d 20 3d 20 22 2d 72 77 78 72 77 78 72 77 78 22  ] = "-rwxrwxrwx"
278e0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
278f0 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 29 21 3d   if( strlen(z)!=
27900 31 30 20 29 20 67 6f 74 6f 20 70 61 72 73 65 5f  10 ) goto parse_
27910 65 72 72 6f 72 3b 0a 20 20 20 20 73 77 69 74 63  error;.    switc
27920 68 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  h( z[0] ){.     
27930 20 63 61 73 65 20 27 2d 27 3a 20 6d 6f 64 65 20   case '-': mode 
27940 7c 3d 20 53 5f 49 46 52 45 47 3b 20 62 72 65 61  |= S_IFREG; brea
27950 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 27 64  k;.      case 'd
27960 27 3a 20 6d 6f 64 65 20 7c 3d 20 53 5f 49 46 44  ': mode |= S_IFD
27970 49 52 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  IR; break;.     
27980 20 63 61 73 65 20 27 6c 27 3a 20 6d 6f 64 65 20   case 'l': mode 
27990 7c 3d 20 53 5f 49 46 4c 4e 4b 3b 20 62 72 65 61  |= S_IFLNK; brea
279a0 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
279b0 3a 20 67 6f 74 6f 20 70 61 72 73 65 5f 65 72 72  : goto parse_err
279c0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  or;.    }.    fo
279d0 72 28 69 3d 31 3b 20 69 3c 31 30 3b 20 69 2b 2b  r(i=1; i<10; i++
279e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
279f0 5d 3d 3d 7a 54 65 6d 70 6c 61 74 65 5b 69 5d 20  ]==zTemplate[i] 
27a00 29 20 6d 6f 64 65 20 7c 3d 20 31 20 3c 3c 20 28  ) mode |= 1 << (
27a10 39 2d 69 29 3b 0a 20 20 20 20 20 20 65 6c 73 65  9-i);.      else
27a20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 2d 27 20 29   if( z[i]!='-' )
27a30 20 67 6f 74 6f 20 70 61 72 73 65 5f 65 72 72 6f   goto parse_erro
27a40 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  r;.    }.  }.  i
27a50 66 28 20 28 28 6d 6f 64 65 20 26 20 53 5f 49 46  f( ((mode & S_IF
27a60 44 49 52 29 3d 3d 30 29 3d 3d 62 49 73 44 69 72  DIR)==0)==bIsDir
27a70 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 22   ){.    /* The "
27a80 6d 6f 64 65 22 20 61 74 74 72 69 62 75 74 65 20  mode" attribute 
27a90 69 73 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  is a directory, 
27aa0 62 75 74 20 64 61 74 61 20 68 61 73 20 62 65 65  but data has bee
27ab0 6e 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  n specified..   
27ac0 20 2a 2a 20 4f 72 20 76 69 63 65 2d 76 65 72 73   ** Or vice-vers
27ad0 61 20 2d 20 6e 6f 20 64 61 74 61 20 62 75 74 20  a - no data but 
27ae0 22 6d 6f 64 65 22 20 69 73 20 61 20 66 69 6c 65  "mode" is a file
27af0 20 6f 72 20 73 79 6d 6c 69 6e 6b 2e 20 20 2a 2f   or symlink.  */
27b00 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71  .    *pzErr = sq
27b10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a  lite3_mprintf("z
27b20 69 70 66 69 6c 65 3a 20 6d 6f 64 65 20 64 6f 65  ipfile: mode doe
27b30 73 20 6e 6f 74 20 6d 61 74 63 68 20 64 61 74 61  s not match data
27b40 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
27b50 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
27b60 3b 0a 20 20 7d 0a 20 20 2a 70 4d 6f 64 65 20 3d  ;.  }.  *pMode =
27b70 20 6d 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20   mode;.  return 
27b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 70 61 72  SQLITE_OK;.. par
27b90 73 65 5f 65 72 72 6f 72 3a 0a 20 20 2a 70 7a 45  se_error:.  *pzE
27ba0 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
27bb0 69 6e 74 66 28 22 7a 69 70 66 69 6c 65 3a 20 70  intf("zipfile: p
27bc0 61 72 73 65 20 65 72 72 6f 72 20 69 6e 20 6d 6f  arse error in mo
27bd0 64 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 72  de: %s", z);.  r
27be0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27bf0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74  OR;.}../*.** Bot
27c00 68 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20  h (const char*) 
27c10 61 72 67 75 6d 65 6e 74 73 20 70 6f 69 6e 74 20  arguments point 
27c20 74 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  to nul-terminate
27c30 64 20 73 74 72 69 6e 67 73 2e 20 41 72 67 75 6d  d strings. Argum
27c40 65 6e 74 0a 2a 2a 20 6e 42 20 69 73 20 74 68 65  ent.** nB is the
27c50 20 76 61 6c 75 65 20 6f 66 20 73 74 72 6c 65 6e   value of strlen
27c60 28 7a 42 29 2e 20 54 68 69 73 20 66 75 6e 63 74  (zB). This funct
27c70 69 6f 6e 20 72 65 74 75 72 6e 73 20 30 20 69 66  ion returns 0 if
27c80 20 74 68 65 20 73 74 72 69 6e 67 73 20 61 72 65   the strings are
27c90 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 69  .** identical, i
27ca0 67 6e 6f 72 69 6e 67 20 61 6e 79 20 74 72 61 69  gnoring any trai
27cb0 6c 69 6e 67 20 27 2f 27 20 63 68 61 72 61 63 74  ling '/' charact
27cc0 65 72 20 69 6e 20 65 69 74 68 65 72 20 70 61 74  er in either pat
27cd0 68 2e 20 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h.  */.static in
27ce0 74 20 7a 69 70 66 69 6c 65 43 6f 6d 70 61 72 65  t zipfileCompare
27cf0 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
27d00 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *zA, const char 
27d10 2a 7a 42 2c 20 69 6e 74 20 6e 42 29 7b 0a 20 20  *zB, int nB){.  
27d20 69 6e 74 20 6e 41 20 3d 20 28 69 6e 74 29 73 74  int nA = (int)st
27d30 72 6c 65 6e 28 7a 41 29 3b 0a 20 20 69 66 28 20  rlen(zA);.  if( 
27d40 7a 41 5b 6e 41 2d 31 5d 3d 3d 27 2f 27 20 29 20  zA[nA-1]=='/' ) 
27d50 6e 41 2d 2d 3b 0a 20 20 69 66 28 20 7a 42 5b 6e  nA--;.  if( zB[n
27d60 42 2d 31 5d 3d 3d 27 2f 27 20 29 20 6e 42 2d 2d  B-1]=='/' ) nB--
27d70 3b 0a 20 20 69 66 28 20 6e 41 3d 3d 6e 42 20 26  ;.  if( nA==nB &
27d80 26 20 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c  & memcmp(zA, zB,
27d90 20 6e 41 29 3d 3d 30 20 29 20 72 65 74 75 72 6e   nA)==0 ) return
27da0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
27db0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69  }..static int zi
27dc0 70 66 69 6c 65 42 65 67 69 6e 28 73 71 6c 69 74  pfileBegin(sqlit
27dd0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
27de0 0a 20 20 5a 69 70 66 69 6c 65 54 61 62 20 2a 70  .  ZipfileTab *p
27df0 54 61 62 20 3d 20 28 5a 69 70 66 69 6c 65 54 61  Tab = (ZipfileTa
27e00 62 2a 29 70 56 74 61 62 3b 0a 20 20 69 6e 74 20  b*)pVtab;.  int 
27e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27e20 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
27e30 3e 70 57 72 69 74 65 46 64 3d 3d 30 20 29 3b 0a  >pWriteFd==0 );.
27e40 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 77 72 69  .  /* Open a wri
27e50 74 65 20 66 64 20 6f 6e 20 74 68 65 20 66 69 6c  te fd on the fil
27e60 65 2e 20 41 6c 73 6f 20 6c 6f 61 64 20 74 68 65  e. Also load the
27e70 20 65 6e 74 69 72 65 20 63 65 6e 74 72 61 6c 20   entire central 
27e80 64 69 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 73  directory.  ** s
27e90 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
27ea0 6d 6f 72 79 2e 20 44 75 72 69 6e 67 20 74 68 65  mory. During the
27eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 79   transaction any
27ec0 20 6e 65 77 20 66 69 6c 65 20 64 61 74 61 20 69   new file data i
27ed0 73 20 0a 20 20 2a 2a 20 61 70 70 65 6e 64 65 64  s .  ** appended
27ee0 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 20   to the archive 
27ef0 66 69 6c 65 2c 20 62 75 74 20 74 68 65 20 63 65  file, but the ce
27f00 6e 74 72 61 6c 20 64 69 72 65 63 74 6f 72 79 20  ntral directory 
27f10 69 73 20 61 63 63 75 6d 75 6c 61 74 65 64 0a 20  is accumulated. 
27f20 20 2a 2a 20 69 6e 20 6d 61 69 6e 2d 6d 65 6d 6f   ** in main-memo
27f30 72 79 20 75 6e 74 69 6c 20 74 68 65 20 74 72 61  ry until the tra
27f40 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
27f50 69 74 74 65 64 2e 20 20 2a 2f 0a 20 20 70 54 61  itted.  */.  pTa
27f60 62 2d 3e 70 57 72 69 74 65 46 64 20 3d 20 66 6f  b->pWriteFd = fo
27f70 70 65 6e 28 70 54 61 62 2d 3e 7a 46 69 6c 65 2c  pen(pTab->zFile,
27f80 20 22 61 62 2b 22 29 3b 0a 20 20 69 66 28 20 70   "ab+");.  if( p
27f90 54 61 62 2d 3e 70 57 72 69 74 65 46 64 3d 3d 30  Tab->pWriteFd==0
27fa0 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61   ){.    pTab->ba
27fb0 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
27fc0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
27fd0 20 20 20 20 20 20 22 7a 69 70 66 69 6c 65 3a 20        "zipfile: 
27fe0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66  failed to open f
27ff0 69 6c 65 20 25 73 20 66 6f 72 20 77 72 69 74 69  ile %s for writi
28000 6e 67 22 2c 20 70 54 61 62 2d 3e 7a 46 69 6c 65  ng", pTab->zFile
28010 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28020 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
28030 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
28040 66 73 65 65 6b 28 70 54 61 62 2d 3e 70 57 72 69  fseek(pTab->pWri
28050 74 65 46 64 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  teFd, 0, SEEK_EN
28060 44 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 73 7a  D);.    pTab->sz
28070 43 75 72 72 65 6e 74 20 3d 20 70 54 61 62 2d 3e  Current = pTab->
28080 73 7a 4f 72 69 67 20 3d 20 28 69 36 34 29 66 74  szOrig = (i64)ft
28090 65 6c 6c 28 70 54 61 62 2d 3e 70 57 72 69 74 65  ell(pTab->pWrite
280a0 46 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 7a 69  Fd);.    rc = zi
280b0 70 66 69 6c 65 4c 6f 61 64 44 69 72 65 63 74 6f  pfileLoadDirecto
280c0 72 79 28 70 54 61 62 2c 20 30 2c 20 30 29 3b 0a  ry(pTab, 0, 0);.
280d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
280e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
280f0 7a 69 70 66 69 6c 65 43 6c 65 61 6e 75 70 54 72  zipfileCleanupTr
28100 61 6e 73 61 63 74 69 6f 6e 28 70 54 61 62 29 3b  ansaction(pTab);
28110 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
28120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
28130 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
28140 69 6d 65 20 61 73 20 61 20 33 32 2d 62 69 74 20  ime as a 32-bit 
28150 74 69 6d 65 73 74 61 6d 70 20 69 6e 20 55 4e 49  timestamp in UNI
28160 58 20 65 70 6f 63 68 20 66 6f 72 6d 61 74 20 28  X epoch format (
28170 6c 69 6b 65 0a 2a 2a 20 74 69 6d 65 28 32 29 29  like.** time(2))
28180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
28190 7a 69 70 66 69 6c 65 54 69 6d 65 28 76 6f 69 64  zipfileTime(void
281a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
281b0 20 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33   *pVfs = sqlite3
281c0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
281d0 75 33 32 20 72 65 74 3b 0a 20 20 69 66 28 20 70  u32 ret;.  if( p
281e0 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32  Vfs->iVersion>=2
281f0 20 26 26 20 70 56 66 73 2d 3e 78 43 75 72 72 65   && pVfs->xCurre
28200 6e 74 54 69 6d 65 49 6e 74 36 34 20 29 7b 0a 20  ntTimeInt64 ){. 
28210 20 20 20 69 36 34 20 6d 73 3b 0a 20 20 20 20 70     i64 ms;.    p
28220 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
28230 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 6d 73  eInt64(pVfs, &ms
28240 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 28 75 33  );.    ret = (u3
28250 32 29 28 28 6d 73 2f 31 30 30 30 29 20 2d 20 28  2)((ms/1000) - (
28260 28 69 36 34 29 32 34 34 30 35 38 37 35 20 2a 20  (i64)24405875 * 
28270 38 36 34 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  8640));.  }else{
28280 0a 20 20 20 20 64 6f 75 62 6c 65 20 64 61 79 3b  .    double day;
28290 0a 20 20 20 20 70 56 66 73 2d 3e 78 43 75 72 72  .    pVfs->xCurr
282a0 65 6e 74 54 69 6d 65 28 70 56 66 73 2c 20 26 64  entTime(pVfs, &d
282b0 61 79 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 28  ay);.    ret = (
282c0 75 33 32 29 28 28 64 61 79 20 2d 20 32 34 34 30  u32)((day - 2440
282d0 35 38 37 2e 35 29 20 2a 20 38 36 34 30 30 29 3b  587.5) * 86400);
282e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
282f0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
28300 72 6e 20 61 20 33 32 2d 62 69 74 20 74 69 6d 65  rn a 32-bit time
28310 73 74 61 6d 70 20 69 6e 20 55 4e 49 58 20 65 70  stamp in UNIX ep
28320 6f 63 68 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  och format..**.*
28330 2a 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 70  * If the value p
28340 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
28350 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 65 69  y argument is ei
28360 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20 61 6e 20  ther NULL or an 
28370 53 51 4c 20 4e 55 4c 4c 2c 0a 2a 2a 20 72 65 74  SQL NULL,.** ret
28380 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
28390 74 69 6d 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  time. Otherwise,
283a0 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
283b0 65 20 73 74 6f 72 65 64 20 69 6e 20 28 2a 70 56  e stored in (*pV
283c0 61 6c 29 0a 2a 2a 20 63 61 73 74 20 74 6f 20 61  al).** cast to a
283d0 20 33 32 2d 62 69 74 20 75 6e 73 69 67 6e 65 64   32-bit unsigned
283e0 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
283f0 74 69 63 20 75 33 32 20 7a 69 70 66 69 6c 65 47  tic u32 zipfileG
28400 65 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  etTime(sqlite3_v
28410 61 6c 75 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69  alue *pVal){.  i
28420 66 28 20 70 56 61 6c 3d 3d 30 20 7c 7c 20 73 71  f( pVal==0 || sq
28430 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
28440 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 4e  (pVal)==SQLITE_N
28450 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
28460 6e 20 7a 69 70 66 69 6c 65 54 69 6d 65 28 29 3b  n zipfileTime();
28470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 75  .  }.  return (u
28480 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  32)sqlite3_value
28490 5f 69 6e 74 36 34 28 70 56 61 6c 29 3b 0a 7d 0a  _int64(pVal);.}.
284a0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69 74  ./*.** Unless it
284b0 20 69 73 20 4e 55 4c 4c 2c 20 65 6e 74 72 79 20   is NULL, entry 
284c0 70 4f 6c 64 20 69 73 20 63 75 72 72 65 6e 74 6c  pOld is currentl
284d0 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 54  y part of the pT
284e0 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72 79 0a  ab->pFirstEntry.
284f0 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20  ** linked list. 
28500 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   Remove it from 
28510 74 68 65 20 6c 69 73 74 20 61 6e 64 20 66 72 65  the list and fre
28520 65 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  e the object..*/
28530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70  .static void zip
28540 66 69 6c 65 52 65 6d 6f 76 65 45 6e 74 72 79 46  fileRemoveEntryF
28550 72 6f 6d 4c 69 73 74 28 5a 69 70 66 69 6c 65 54  romList(ZipfileT
28560 61 62 20 2a 70 54 61 62 2c 20 5a 69 70 66 69 6c  ab *pTab, Zipfil
28570 65 45 6e 74 72 79 20 2a 70 4f 6c 64 29 7b 0a 20  eEntry *pOld){. 
28580 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20   if( pOld ){.   
28590 20 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 2a   ZipfileEntry **
285a0 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
285b0 70 54 61 62 2d 3e 70 46 69 72 73 74 45 6e 74 72  pTab->pFirstEntr
285c0 79 3b 20 28 2a 70 70 29 21 3d 70 4f 6c 64 3b 20  y; (*pp)!=pOld; 
285d0 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
285e0 74 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  t));.    *pp = (
285f0 2a 70 70 29 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  *pp)->pNext;.   
28600 20 7a 69 70 66 69 6c 65 45 6e 74 72 79 46 72 65   zipfileEntryFre
28610 65 28 70 4f 6c 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(pOld);.  }.}..
28620 2f 2a 0a 2a 2a 20 78 55 70 64 61 74 65 20 6d 65  /*.** xUpdate me
28630 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
28640 69 6e 74 20 7a 69 70 66 69 6c 65 55 70 64 61 74  int zipfileUpdat
28650 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  e(.  sqlite3_vta
28660 62 20 2a 70 56 74 61 62 2c 20 0a 20 20 69 6e 74  b *pVtab, .  int
28670 20 6e 56 61 6c 2c 20 0a 20 20 73 71 6c 69 74 65   nVal, .  sqlite
28680 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c  3_value **apVal,
28690 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34   .  sqlite_int64
286a0 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20 5a 69   *pRowid.){.  Zi
286b0 70 66 69 6c 65 54 61 62 20 2a 70 54 61 62 20 3d  pfileTab *pTab =
286c0 20 28 5a 69 70 66 69 6c 65 54 61 62 2a 29 70 56   (ZipfileTab*)pV
286d0 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  tab;.  int rc = 
286e0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
286f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28700 20 43 6f 64 65 20 2a 2f 0a 20 20 5a 69 70 66 69   Code */.  Zipfi
28710 6c 65 45 6e 74 72 79 20 2a 70 4e 65 77 20 3d 20  leEntry *pNew = 
28720 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  0;         /* Ne
28730 77 20 69 6e 2d 6d 65 6d 6f 72 79 20 43 44 53 20  w in-memory CDS 
28740 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 75 33 32 20  entry */..  u32 
28750 6d 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 20 20  mode = 0;       
28760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
28770 6f 64 65 20 66 6f 72 20 6e 65 77 20 65 6e 74 72  ode for new entr
28780 79 20 2a 2f 0a 20 20 75 33 32 20 6d 54 69 6d 65  y */.  u32 mTime
28790 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
287a0 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69         /* Modifi
287b0 63 61 74 69 6f 6e 20 74 69 6d 65 20 66 6f 72 20  cation time for 
287c0 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  new entry */.  i
287d0 36 34 20 73 7a 20 3d 20 30 3b 20 20 20 20 20 20  64 sz = 0;      
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
287f0 2a 20 55 6e 63 6f 6d 70 72 65 73 73 65 64 20 73  * Uncompressed s
28800 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ize */.  const c
28810 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 30 3b 20  har *zPath = 0; 
28820 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
28830 20 66 6f 72 20 6e 65 77 20 65 6e 74 72 79 20 2a   for new entry *
28840 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20  /.  int nPath = 
28850 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
28860 20 20 20 20 2f 2a 20 73 74 72 6c 65 6e 28 7a 50      /* strlen(zP
28870 61 74 68 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ath) */.  const 
28880 75 38 20 2a 70 44 61 74 61 20 3d 20 30 3b 20 20  u8 *pData = 0;  
28890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
288a0 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
288b0 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e  ontaining conten
288c0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  t */.  int nData
288d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
288e0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
288f0 66 20 70 44 61 74 61 20 62 75 66 66 65 72 20 69  f pData buffer i
28900 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
28910 20 69 4d 65 74 68 6f 64 20 3d 20 30 3b 20 20 20   iMethod = 0;   
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28930 43 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74 68  Compression meth
28940 6f 64 20 66 6f 72 20 6e 65 77 20 65 6e 74 72 79  od for new entry
28950 20 2a 2f 0a 20 20 75 38 20 2a 70 46 72 65 65 20   */.  u8 *pFree 
28960 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
28970 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
28980 69 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  is */.  char *zF
28990 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ree = 0;        
289a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20          /* Also 
289b0 66 72 65 65 20 74 68 69 73 20 2a 2f 0a 20 20 5a  free this */.  Z
289c0 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 4f 6c  ipfileEntry *pOl
289d0 64 20 3d 20 30 3b 0a 20 20 5a 69 70 66 69 6c 65  d = 0;.  Zipfile
289e0 45 6e 74 72 79 20 2a 70 4f 6c 64 32 20 3d 20 30  Entry *pOld2 = 0
289f0 3b 0a 20 20 69 6e 74 20 62 55 70 64 61 74 65 20  ;.  int bUpdate 
28a00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
28a10 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
28a20 61 6e 20 75 70 64 61 74 65 20 74 68 61 74 20 6d  an update that m
28a30 6f 64 69 66 69 65 73 20 22 6e 61 6d 65 22 20 2a  odifies "name" *
28a40 2f 0a 20 20 69 6e 74 20 62 49 73 44 69 72 20 3d  /.  int bIsDir =
28a50 20 30 3b 0a 20 20 75 33 32 20 69 43 72 63 33 32   0;.  u32 iCrc32
28a60 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 54 61   = 0;..  if( pTa
28a70 62 2d 3e 70 57 72 69 74 65 46 64 3d 3d 30 20 29  b->pWriteFd==0 )
28a80 7b 0a 20 20 20 20 72 63 20 3d 20 7a 69 70 66 69  {.    rc = zipfi
28a90 6c 65 42 65 67 69 6e 28 70 56 74 61 62 29 3b 0a  leBegin(pVtab);.
28aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28ab0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28ac0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
28ad0 74 68 69 73 20 69 73 20 61 20 44 45 4c 45 54 45  this is a DELETE
28ae0 20 6f 72 20 55 50 44 41 54 45 2c 20 66 69 6e 64   or UPDATE, find
28af0 20 74 68 65 20 61 72 63 68 69 76 65 20 65 6e 74   the archive ent
28b00 72 79 20 74 6f 20 64 65 6c 65 74 65 2e 20 2a 2f  ry to delete. */
28b10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
28b20 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b  alue_type(apVal[
28b30 30 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])!=SQLITE_NULL
28b40 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
28b50 61 72 20 2a 7a 44 65 6c 65 74 65 20 3d 20 28 63  ar *zDelete = (c
28b60 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
28b70 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
28b80 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74  Val[0]);.    int
28b90 20 6e 44 65 6c 65 74 65 20 3d 20 28 69 6e 74 29   nDelete = (int)
28ba0 73 74 72 6c 65 6e 28 7a 44 65 6c 65 74 65 29 3b  strlen(zDelete);
28bb0 0a 20 20 20 20 69 66 28 20 6e 56 61 6c 3e 31 20  .    if( nVal>1 
28bc0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
28bd0 68 61 72 20 2a 7a 55 70 64 61 74 65 20 3d 20 28  har *zUpdate = (
28be0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
28bf0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
28c00 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
28c10 69 66 28 20 7a 55 70 64 61 74 65 20 26 26 20 7a  if( zUpdate && z
28c20 69 70 66 69 6c 65 43 6f 6d 70 61 72 65 50 61 74  ipfileComparePat
28c30 68 28 7a 55 70 64 61 74 65 2c 20 7a 44 65 6c 65  h(zUpdate, zDele
28c40 74 65 2c 20 6e 44 65 6c 65 74 65 29 21 3d 30 20  te, nDelete)!=0 
28c50 29 7b 0a 20 20 20 20 20 20 20 20 62 55 70 64 61  ){.        bUpda
28c60 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  te = 1;.      }.
28c70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 4f      }.    for(pO
28c80 6c 64 3d 70 54 61 62 2d 3e 70 46 69 72 73 74 45  ld=pTab->pFirstE
28c90 6e 74 72 79 3b 20 31 3b 20 70 4f 6c 64 3d 70 4f  ntry; 1; pOld=pO
28ca0 6c 64 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ld->pNext){.    
28cb0 20 20 69 66 28 20 7a 69 70 66 69 6c 65 43 6f 6d    if( zipfileCom
28cc0 70 61 72 65 50 61 74 68 28 70 4f 6c 64 2d 3e 63  parePath(pOld->c
28cd0 64 73 2e 7a 46 69 6c 65 2c 20 7a 44 65 6c 65 74  ds.zFile, zDelet
28ce0 65 2c 20 6e 44 65 6c 65 74 65 29 3d 3d 30 20 29  e, nDelete)==0 )
28cf0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
28d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
28d10 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 70 4e 65  ssert( pOld->pNe
28d20 78 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xt );.    }.  }.
28d30 0a 20 20 69 66 28 20 6e 56 61 6c 3e 31 20 29 7b  .  if( nVal>1 ){
28d40 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
28d50 61 74 20 22 73 7a 22 20 61 6e 64 20 22 72 61 77  at "sz" and "raw
28d60 64 61 74 61 22 20 61 72 65 20 62 6f 74 68 20 4e  data" are both N
28d70 55 4c 4c 3a 20 2a 2f 0a 20 20 20 20 69 66 28 20  ULL: */.    if( 
28d80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
28d90 70 65 28 61 70 56 61 6c 5b 35 5d 29 21 3d 53 51  pe(apVal[5])!=SQ
28da0 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
28db0 20 20 20 7a 69 70 66 69 6c 65 54 61 62 6c 65 45     zipfileTableE
28dc0 72 72 28 70 54 61 62 2c 20 22 73 7a 20 6d 75 73  rr(pTab, "sz mus
28dd0 74 20 62 65 20 4e 55 4c 4c 22 29 3b 0a 20 20 20  t be NULL");.   
28de0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28df0 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
28e00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
28e10 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61  _value_type(apVa
28e20 6c 5b 36 5d 29 21 3d 53 51 4c 49 54 45 5f 4e 55  l[6])!=SQLITE_NU
28e30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 7a 69 70 66  LL ){.      zipf
28e40 69 6c 65 54 61 62 6c 65 45 72 72 28 70 54 61 62  ileTableErr(pTab
28e50 2c 20 22 72 61 77 64 61 74 61 20 6d 75 73 74 20  , "rawdata must 
28e60 62 65 20 4e 55 4c 4c 22 29 3b 20 0a 20 20 20 20  be NULL"); .    
28e70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
28e80 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
28e90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
28ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28eb0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
28ec0 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 37 5d 29  e_type(apVal[7])
28ed0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
28ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 64 61 74 61  .        /* data
28ef0 3d 4e 55 4c 4c 2e 20 41 20 64 69 72 65 63 74 6f  =NULL. A directo
28f00 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 49  ry */.        bI
28f10 73 44 69 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  sDir = 1;.      
28f20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
28f30 2a 20 56 61 6c 75 65 20 73 70 65 63 69 66 69 65  * Value specifie
28f40 64 20 66 6f 72 20 22 64 61 74 61 22 2c 20 61 6e  d for "data", an
28f50 64 20 70 6f 73 73 69 62 6c 79 20 22 6d 65 74 68  d possibly "meth
28f60 6f 64 22 2e 20 54 68 69 73 20 6d 75 73 74 20 62  od". This must b
28f70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  e.        ** a r
28f80 65 67 75 6c 61 72 20 66 69 6c 65 20 6f 72 20 61  egular file or a
28f90 20 73 79 6d 6c 69 6e 6b 2e 20 2a 2f 0a 20 20 20   symlink. */.   
28fa0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 61       const u8 *a
28fb0 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
28fc0 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 37 5d  ue_blob(apVal[7]
28fd0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  );.        int n
28fe0 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
28ff0 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 37  ue_bytes(apVal[7
29000 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ]);.        int 
29010 62 41 75 74 6f 20 3d 20 73 71 6c 69 74 65 33 5f  bAuto = sqlite3_
29020 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 6c  value_type(apVal
29030 5b 38 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  [8])==SQLITE_NUL
29040 4c 3b 0a 0a 20 20 20 20 20 20 20 20 69 4d 65 74  L;..        iMet
29050 68 6f 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  hod = sqlite3_va
29060 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 38 5d  lue_int(apVal[8]
29070 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  );.        sz = 
29080 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 70 44 61  nIn;.        pDa
29090 74 61 20 3d 20 61 49 6e 3b 0a 20 20 20 20 20 20  ta = aIn;.      
290a0 20 20 6e 44 61 74 61 20 3d 20 6e 49 6e 3b 0a 20    nData = nIn;. 
290b0 20 20 20 20 20 20 20 69 66 28 20 69 4d 65 74 68         if( iMeth
290c0 6f 64 21 3d 30 20 26 26 20 69 4d 65 74 68 6f 64  od!=0 && iMethod
290d0 21 3d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=8 ){.         
290e0 20 7a 69 70 66 69 6c 65 54 61 62 6c 65 45 72 72   zipfileTableErr
290f0 28 70 54 61 62 2c 20 22 75 6e 6b 6e 6f 77 6e 20  (pTab, "unknown 
29100 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65 74 68  compression meth
29110 6f 64 3a 20 25 64 22 2c 20 69 4d 65 74 68 6f 64  od: %d", iMethod
29120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
29130 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
29140 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  INT;.        }el
29150 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
29160 28 20 62 41 75 74 6f 20 7c 7c 20 69 4d 65 74 68  ( bAuto || iMeth
29170 6f 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  od ){.          
29180 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
29190 20 20 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70          rc = zip
291a0 66 69 6c 65 44 65 66 6c 61 74 65 28 61 49 6e 2c  fileDeflate(aIn,
291b0 20 6e 49 6e 2c 20 26 70 46 72 65 65 2c 20 26 6e   nIn, &pFree, &n
291c0 43 6d 70 2c 20 26 70 54 61 62 2d 3e 62 61 73 65  Cmp, &pTab->base
291d0 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  .zErrMsg);.     
291e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
291f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29200 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4d            if( iM
29210 65 74 68 6f 64 20 7c 7c 20 6e 43 6d 70 3c 6e 49  ethod || nCmp<nI
29220 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
29230 20 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 38       iMethod = 8
29240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29250 20 20 70 44 61 74 61 20 3d 20 70 46 72 65 65 3b    pData = pFree;
29260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29270 20 6e 44 61 74 61 20 3d 20 6e 43 6d 70 3b 0a 20   nData = nCmp;. 
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
29290 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
292a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
292b0 20 20 20 69 43 72 63 33 32 20 3d 20 63 72 63 33     iCrc32 = crc3
292c0 32 28 30 2c 20 61 49 6e 2c 20 6e 49 6e 29 3b 0a  2(0, aIn, nIn);.
292d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
292e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
292f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29300 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 69 70  {.      rc = zip
29310 66 69 6c 65 47 65 74 4d 6f 64 65 28 61 70 56 61  fileGetMode(apVa
29320 6c 5b 33 5d 2c 20 62 49 73 44 69 72 2c 20 26 6d  l[3], bIsDir, &m
29330 6f 64 65 2c 20 26 70 54 61 62 2d 3e 62 61 73 65  ode, &pTab->base
29340 2e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d  .zErrMsg);.    }
29350 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
29360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29370 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20   zPath = (const 
29380 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
29390 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
293a0 5d 29 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 20  ]);.      nPath 
293b0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50  = (int)strlen(zP
293c0 61 74 68 29 3b 0a 20 20 20 20 20 20 6d 54 69 6d  ath);.      mTim
293d0 65 20 3d 20 7a 69 70 66 69 6c 65 47 65 74 54 69  e = zipfileGetTi
293e0 6d 65 28 61 70 56 61 6c 5b 34 5d 29 3b 0a 20 20  me(apVal[4]);.  
293f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
29400 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 49  =SQLITE_OK && bI
29410 73 44 69 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  sDir ){.      /*
29420 20 46 6f 72 20 61 20 64 69 72 65 63 74 6f 72 79   For a directory
29430 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
29440 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
29450 69 6e 20 74 68 65 20 70 61 74 68 20 69 73 20 61  in the path is a
29460 0a 20 20 20 20 20 20 2a 2a 20 27 2f 27 2e 20 54  .      ** '/'. T
29470 68 69 73 20 61 70 70 65 61 72 73 20 74 6f 20 62  his appears to b
29480 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63  e required for c
29490 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
294a0 68 20 69 6e 66 6f 2d 7a 69 70 0a 20 20 20 20 20  h info-zip.     
294b0 20 2a 2a 20 28 74 68 65 20 75 6e 7a 69 70 20 63   ** (the unzip c
294c0 6f 6d 6d 61 6e 64 20 6f 6e 20 75 6e 69 78 29 2e  ommand on unix).
294d0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 72 65   It does not cre
294e0 61 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 0a  ate directories.
294f0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 77 69        ** otherwi
29500 73 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  se.  */.      if
29510 28 20 7a 50 61 74 68 5b 6e 50 61 74 68 2d 31 5d  ( zPath[nPath-1]
29520 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  !='/' ){.       
29530 20 7a 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33   zFree = sqlite3
29540 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22 2c 20  _mprintf("%s/", 
29550 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
29560 69 66 28 20 7a 46 72 65 65 3d 3d 30 20 29 7b 20  if( zFree==0 ){ 
29570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
29580 4d 3b 20 7d 0a 20 20 20 20 20 20 20 20 7a 50 61  M; }.        zPa
29590 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
295a0 2a 29 7a 46 72 65 65 3b 0a 20 20 20 20 20 20 20  *)zFree;.       
295b0 20 6e 50 61 74 68 2b 2b 3b 0a 20 20 20 20 20 20   nPath++;.      
295c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
295d0 43 68 65 63 6b 20 74 68 61 74 20 77 65 27 72 65  Check that we're
295e0 20 6e 6f 74 20 69 6e 73 65 72 74 69 6e 67 20 61   not inserting a
295f0 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72 79   duplicate entry
29600 20 2d 4f 52 2d 20 75 70 64 61 74 69 6e 67 20 61   -OR- updating a
29610 6e 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 77  n.    ** entry w
29620 69 74 68 20 61 20 70 61 74 68 2c 20 74 68 65 72  ith a path, ther
29630 65 62 79 20 6d 61 6b 69 6e 67 20 69 74 20 69 6e  eby making it in
29640 74 6f 20 61 20 64 75 70 6c 69 63 61 74 65 2e 20  to a duplicate. 
29650 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4f 6c 64  */.    if( (pOld
29660 3d 3d 30 20 7c 7c 20 62 55 70 64 61 74 65 29 20  ==0 || bUpdate) 
29670 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
29680 20 29 7b 0a 20 20 20 20 20 20 5a 69 70 66 69 6c   ){.      Zipfil
29690 65 45 6e 74 72 79 20 2a 70 3b 0a 20 20 20 20 20  eEntry *p;.     
296a0 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 46 69   for(p=pTab->pFi
296b0 72 73 74 45 6e 74 72 79 3b 20 70 3b 20 70 3d 70  rstEntry; p; p=p
296c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
296d0 20 20 69 66 28 20 7a 69 70 66 69 6c 65 43 6f 6d    if( zipfileCom
296e0 70 61 72 65 50 61 74 68 28 70 2d 3e 63 64 73 2e  parePath(p->cds.
296f0 7a 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 6e 50  zFile, zPath, nP
29700 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ath)==0 ){.     
29710 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
29720 69 74 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e  ite3_vtab_on_con
29730 66 6c 69 63 74 28 70 54 61 62 2d 3e 64 62 29 20  flict(pTab->db) 
29740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
29750 61 73 65 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ase SQLITE_IGNOR
29760 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E: {.           
29770 20 20 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f     goto zipfile_
29780 75 70 64 61 74 65 5f 64 6f 6e 65 3b 0a 20 20 20  update_done;.   
29790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
297a0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
297b0 54 45 5f 52 45 50 4c 41 43 45 3a 20 7b 0a 20 20  TE_REPLACE: {.  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 6c 64              pOld
297d0 32 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  2 = p;.         
297e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
297f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29800 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
29810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
29820 69 70 66 69 6c 65 54 61 62 6c 65 45 72 72 28 70  ipfileTableErr(p
29830 54 61 62 2c 20 22 64 75 70 6c 69 63 61 74 65 20  Tab, "duplicate 
29840 6e 61 6d 65 3a 20 5c 22 25 73 5c 22 22 2c 20 7a  name: \"%s\"", z
29850 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  Path);.         
29860 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29870 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
29880 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
29890 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
298a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
298b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
298c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
298d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
298e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
298f0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74       /* Create t
29900 68 65 20 6e 65 77 20 43 44 53 20 72 65 63 6f 72  he new CDS recor
29910 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  d. */.      pNew
29920 20 3d 20 7a 69 70 66 69 6c 65 4e 65 77 45 6e 74   = zipfileNewEnt
29930 72 79 28 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  ry(zPath);.     
29940 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
29950 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29960 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
29970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29980 70 4e 65 77 2d 3e 63 64 73 2e 69 56 65 72 73 69  pNew->cds.iVersi
29990 6f 6e 4d 61 64 65 42 79 20 3d 20 5a 49 50 46 49  onMadeBy = ZIPFI
299a0 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 4d 41 44 45  LE_NEWENTRY_MADE
299b0 42 59 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  BY;.        pNew
299c0 2d 3e 63 64 73 2e 69 56 65 72 73 69 6f 6e 45 78  ->cds.iVersionEx
299d0 74 72 61 63 74 20 3d 20 5a 49 50 46 49 4c 45 5f  tract = ZIPFILE_
299e0 4e 45 57 45 4e 54 52 59 5f 52 45 51 55 49 52 45  NEWENTRY_REQUIRE
299f0 44 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  D;.        pNew-
29a00 3e 63 64 73 2e 66 6c 61 67 73 20 3d 20 5a 49 50  >cds.flags = ZIP
29a10 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 46 4c  FILE_NEWENTRY_FL
29a20 41 47 53 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  AGS;.        pNe
29a30 77 2d 3e 63 64 73 2e 69 43 6f 6d 70 72 65 73 73  w->cds.iCompress
29a40 69 6f 6e 20 3d 20 28 75 31 36 29 69 4d 65 74 68  ion = (u16)iMeth
29a50 6f 64 3b 0a 20 20 20 20 20 20 20 20 7a 69 70 66  od;.        zipf
29a60 69 6c 65 4d 74 69 6d 65 54 6f 44 6f 73 28 26 70  ileMtimeToDos(&p
29a70 4e 65 77 2d 3e 63 64 73 2c 20 6d 54 69 6d 65 29  New->cds, mTime)
29a80 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
29a90 63 64 73 2e 63 72 63 33 32 20 3d 20 69 43 72 63  cds.crc32 = iCrc
29aa0 33 32 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  32;.        pNew
29ab0 2d 3e 63 64 73 2e 73 7a 43 6f 6d 70 72 65 73 73  ->cds.szCompress
29ac0 65 64 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  ed = nData;.    
29ad0 20 20 20 20 70 4e 65 77 2d 3e 63 64 73 2e 73 7a      pNew->cds.sz
29ae0 55 6e 63 6f 6d 70 72 65 73 73 65 64 20 3d 20 28  Uncompressed = (
29af0 75 33 32 29 73 7a 3b 0a 20 20 20 20 20 20 20 20  u32)sz;.        
29b00 70 4e 65 77 2d 3e 63 64 73 2e 69 45 78 74 65 72  pNew->cds.iExter
29b10 6e 61 6c 41 74 74 72 20 3d 20 28 6d 6f 64 65 3c  nalAttr = (mode<
29b20 3c 31 36 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  <16);.        pN
29b30 65 77 2d 3e 63 64 73 2e 69 4f 66 66 73 65 74 20  ew->cds.iOffset 
29b40 3d 20 28 75 33 32 29 70 54 61 62 2d 3e 73 7a 43  = (u32)pTab->szC
29b50 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
29b60 70 4e 65 77 2d 3e 63 64 73 2e 6e 46 69 6c 65 20  pNew->cds.nFile 
29b70 3d 20 28 75 31 36 29 6e 50 61 74 68 3b 0a 20 20  = (u16)nPath;.  
29b80 20 20 20 20 20 20 70 4e 65 77 2d 3e 6d 55 6e 69        pNew->mUni
29b90 78 54 69 6d 65 20 3d 20 28 75 33 32 29 6d 54 69  xTime = (u32)mTi
29ba0 6d 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  me;.        rc =
29bb0 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 45 6e   zipfileAppendEn
29bc0 74 72 79 28 70 54 61 62 2c 20 70 4e 65 77 2c 20  try(pTab, pNew, 
29bd0 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
29be0 20 20 20 20 20 20 20 7a 69 70 66 69 6c 65 41 64         zipfileAd
29bf0 64 45 6e 74 72 79 28 70 54 61 62 2c 20 70 4f 6c  dEntry(pTab, pOl
29c00 64 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  d, pNew);.      
29c10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
29c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29c30 20 26 26 20 28 70 4f 6c 64 20 7c 7c 20 70 4f 6c   && (pOld || pOl
29c40 64 32 29 20 29 7b 0a 20 20 20 20 5a 69 70 66 69  d2) ){.    Zipfi
29c50 6c 65 43 73 72 20 2a 70 43 73 72 3b 0a 20 20 20  leCsr *pCsr;.   
29c60 20 66 6f 72 28 70 43 73 72 3d 70 54 61 62 2d 3e   for(pCsr=pTab->
29c70 70 43 73 72 4c 69 73 74 3b 20 70 43 73 72 3b 20  pCsrList; pCsr; 
29c80 70 43 73 72 3d 70 43 73 72 2d 3e 70 43 73 72 4e  pCsr=pCsr->pCsrN
29c90 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
29ca0 70 43 73 72 2d 3e 70 43 75 72 72 65 6e 74 20 26  pCsr->pCurrent &
29cb0 26 20 28 70 43 73 72 2d 3e 70 43 75 72 72 65 6e  & (pCsr->pCurren
29cc0 74 3d 3d 70 4f 6c 64 20 7c 7c 20 70 43 73 72 2d  t==pOld || pCsr-
29cd0 3e 70 43 75 72 72 65 6e 74 3d 3d 70 4f 6c 64 32  >pCurrent==pOld2
29ce0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 73  ) ){.        pCs
29cf0 72 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 70 43  r->pCurrent = pC
29d00 73 72 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70 4e  sr->pCurrent->pN
29d10 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 43 73  ext;.        pCs
29d20 72 2d 3e 62 4e 6f 6f 70 20 3d 20 31 3b 0a 20 20  r->bNoop = 1;.  
29d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29d40 20 7a 69 70 66 69 6c 65 52 65 6d 6f 76 65 45 6e   zipfileRemoveEn
29d50 74 72 79 46 72 6f 6d 4c 69 73 74 28 70 54 61 62  tryFromList(pTab
29d60 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7a 69 70  , pOld);.    zip
29d70 66 69 6c 65 52 65 6d 6f 76 65 45 6e 74 72 79 46  fileRemoveEntryF
29d80 72 6f 6d 4c 69 73 74 28 70 54 61 62 2c 20 70 4f  romList(pTab, pO
29d90 6c 64 32 29 3b 0a 20 20 7d 0a 0a 7a 69 70 66 69  ld2);.  }..zipfi
29da0 6c 65 5f 75 70 64 61 74 65 5f 64 6f 6e 65 3a 0a  le_update_done:.
29db0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
29dc0 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Free);.  sqlite3
29dd0 5f 66 72 65 65 28 7a 46 72 65 65 29 3b 0a 20 20  _free(zFree);.  
29de0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
29df0 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69 6c 65  atic int zipfile
29e00 53 65 72 69 61 6c 69 7a 65 45 4f 43 44 28 5a 69  SerializeEOCD(Zi
29e10 70 66 69 6c 65 45 4f 43 44 20 2a 70 2c 20 75 38  pfileEOCD *p, u8
29e20 20 2a 61 42 75 66 29 7b 0a 20 20 75 38 20 2a 61   *aBuf){.  u8 *a
29e30 20 3d 20 61 42 75 66 3b 0a 20 20 7a 69 70 66 69   = aBuf;.  zipfi
29e40 6c 65 57 72 69 74 65 33 32 28 61 2c 20 5a 49 50  leWrite32(a, ZIP
29e50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45 5f 45  FILE_SIGNATURE_E
29e60 4f 43 44 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57  OCD);.  zipfileW
29e70 72 69 74 65 31 36 28 61 2c 20 70 2d 3e 69 44 69  rite16(a, p->iDi
29e80 73 6b 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72  sk);.  zipfileWr
29e90 69 74 65 31 36 28 61 2c 20 70 2d 3e 69 46 69 72  ite16(a, p->iFir
29ea0 73 74 44 69 73 6b 29 3b 0a 20 20 7a 69 70 66 69  stDisk);.  zipfi
29eb0 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70 2d 3e  leWrite16(a, p->
29ec0 6e 45 6e 74 72 79 29 3b 0a 20 20 7a 69 70 66 69  nEntry);.  zipfi
29ed0 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70 2d 3e  leWrite16(a, p->
29ee0 6e 45 6e 74 72 79 54 6f 74 61 6c 29 3b 0a 20 20  nEntryTotal);.  
29ef0 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61  zipfileWrite32(a
29f00 2c 20 70 2d 3e 6e 53 69 7a 65 29 3b 0a 20 20 7a  , p->nSize);.  z
29f10 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c  ipfileWrite32(a,
29f20 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
29f30 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61  zipfileWrite16(a
29f40 2c 20 30 29 3b 20 20 20 20 20 20 20 20 2f 2a 20  , 0);        /* 
29f50 53 69 7a 65 20 6f 66 20 74 72 61 69 6c 69 6e 67  Size of trailing
29f60 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 62 79 74 65   comment in byte
29f70 73 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 61 2d  s*/..  return a-
29f80 61 42 75 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  aBuf;.}..static 
29f90 69 6e 74 20 7a 69 70 66 69 6c 65 41 70 70 65 6e  int zipfileAppen
29fa0 64 45 4f 43 44 28 5a 69 70 66 69 6c 65 54 61 62  dEOCD(ZipfileTab
29fb0 20 2a 70 54 61 62 2c 20 5a 69 70 66 69 6c 65 45   *pTab, ZipfileE
29fc0 4f 43 44 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  OCD *p){.  int n
29fd0 42 75 66 20 3d 20 7a 69 70 66 69 6c 65 53 65 72  Buf = zipfileSer
29fe0 69 61 6c 69 7a 65 45 4f 43 44 28 70 2c 20 70 54  ializeEOCD(p, pT
29ff0 61 62 2d 3e 61 42 75 66 66 65 72 29 3b 0a 20 20  ab->aBuffer);.  
2a000 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 5a 49  assert( nBuf==ZI
2a010 50 46 49 4c 45 5f 45 4f 43 44 5f 46 49 58 45 44  PFILE_EOCD_FIXED
2a020 5f 53 5a 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _SZ );.  return 
2a030 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 44 61 74  zipfileAppendDat
2a040 61 28 70 54 61 62 2c 20 70 54 61 62 2d 3e 61 42  a(pTab, pTab->aB
2a050 75 66 66 65 72 2c 20 6e 42 75 66 29 3b 0a 7d 0a  uffer, nBuf);.}.
2a060 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65  ./*.** Serialize
2a070 20 74 68 65 20 43 44 53 20 73 74 72 75 63 74 75   the CDS structu
2a080 72 65 20 69 6e 74 6f 20 62 75 66 66 65 72 20 61  re into buffer a
2a090 42 75 66 5b 5d 2e 20 52 65 74 75 72 6e 20 74 68  Buf[]. Return th
2a0a0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
2a0b0 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  ytes written..*/
2a0c0 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66  .static int zipf
2a0d0 69 6c 65 53 65 72 69 61 6c 69 7a 65 43 44 53 28  ileSerializeCDS(
2a0e0 5a 69 70 66 69 6c 65 45 6e 74 72 79 20 2a 70 45  ZipfileEntry *pE
2a0f0 6e 74 72 79 2c 20 75 38 20 2a 61 42 75 66 29 7b  ntry, u8 *aBuf){
2a100 0a 20 20 75 38 20 2a 61 20 3d 20 61 42 75 66 3b  .  u8 *a = aBuf;
2a110 0a 20 20 5a 69 70 66 69 6c 65 43 44 53 20 2a 70  .  ZipfileCDS *p
2a120 43 44 53 20 3d 20 26 70 45 6e 74 72 79 2d 3e 63  CDS = &pEntry->c
2a130 64 73 3b 0a 0a 20 20 69 66 28 20 70 45 6e 74 72  ds;..  if( pEntr
2a140 79 2d 3e 61 45 78 74 72 61 3d 3d 30 20 29 7b 0a  y->aExtra==0 ){.
2a150 20 20 20 20 70 43 44 53 2d 3e 6e 45 78 74 72 61      pCDS->nExtra
2a160 20 3d 20 39 3b 0a 20 20 7d 0a 0a 20 20 7a 69 70   = 9;.  }..  zip
2a170 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 5a  fileWrite32(a, Z
2a180 49 50 46 49 4c 45 5f 53 49 47 4e 41 54 55 52 45  IPFILE_SIGNATURE
2a190 5f 43 44 53 29 3b 0a 20 20 7a 69 70 66 69 6c 65  _CDS);.  zipfile
2a1a0 57 72 69 74 65 31 36 28 61 2c 20 70 43 44 53 2d  Write16(a, pCDS-
2a1b0 3e 69 56 65 72 73 69 6f 6e 4d 61 64 65 42 79 29  >iVersionMadeBy)
2a1c0 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
2a1d0 31 36 28 61 2c 20 70 43 44 53 2d 3e 69 56 65 72  16(a, pCDS->iVer
2a1e0 73 69 6f 6e 45 78 74 72 61 63 74 29 3b 0a 20 20  sionExtract);.  
2a1f0 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36 28 61  zipfileWrite16(a
2a200 2c 20 70 43 44 53 2d 3e 66 6c 61 67 73 29 3b 0a  , pCDS->flags);.
2a210 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
2a220 28 61 2c 20 70 43 44 53 2d 3e 69 43 6f 6d 70 72  (a, pCDS->iCompr
2a230 65 73 73 69 6f 6e 29 3b 0a 20 20 7a 69 70 66 69  ession);.  zipfi
2a240 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70 43 44  leWrite16(a, pCD
2a250 53 2d 3e 6d 54 69 6d 65 29 3b 0a 20 20 7a 69 70  S->mTime);.  zip
2a260 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70  fileWrite16(a, p
2a270 43 44 53 2d 3e 6d 44 61 74 65 29 3b 0a 20 20 7a  CDS->mDate);.  z
2a280 69 70 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c  ipfileWrite32(a,
2a290 20 70 43 44 53 2d 3e 63 72 63 33 32 29 3b 0a 20   pCDS->crc32);. 
2a2a0 20 7a 69 70 66 69 6c 65 57 72 69 74 65 33 32 28   zipfileWrite32(
2a2b0 61 2c 20 70 43 44 53 2d 3e 73 7a 43 6f 6d 70 72  a, pCDS->szCompr
2a2c0 65 73 73 65 64 29 3b 0a 20 20 7a 69 70 66 69 6c  essed);.  zipfil
2a2d0 65 57 72 69 74 65 33 32 28 61 2c 20 70 43 44 53  eWrite32(a, pCDS
2a2e0 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64  ->szUncompressed
2a2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 3d 3d  );.  assert( a==
2a300 26 61 42 75 66 5b 5a 49 50 46 49 4c 45 5f 43 44  &aBuf[ZIPFILE_CD
2a310 53 5f 4e 46 49 4c 45 5f 4f 46 46 5d 20 29 3b 0a  S_NFILE_OFF] );.
2a320 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31 36    zipfileWrite16
2a330 28 61 2c 20 70 43 44 53 2d 3e 6e 46 69 6c 65 29  (a, pCDS->nFile)
2a340 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65  ;.  zipfileWrite
2a350 31 36 28 61 2c 20 70 43 44 53 2d 3e 6e 45 78 74  16(a, pCDS->nExt
2a360 72 61 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72  ra);.  zipfileWr
2a370 69 74 65 31 36 28 61 2c 20 70 43 44 53 2d 3e 6e  ite16(a, pCDS->n
2a380 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 7a 69 70 66  Comment);.  zipf
2a390 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 70 43  ileWrite16(a, pC
2a3a0 44 53 2d 3e 69 44 69 73 6b 53 74 61 72 74 29 3b  DS->iDiskStart);
2a3b0 0a 20 20 7a 69 70 66 69 6c 65 57 72 69 74 65 31  .  zipfileWrite1
2a3c0 36 28 61 2c 20 70 43 44 53 2d 3e 69 49 6e 74 65  6(a, pCDS->iInte
2a3d0 72 6e 61 6c 41 74 74 72 29 3b 0a 20 20 7a 69 70  rnalAttr);.  zip
2a3e0 66 69 6c 65 57 72 69 74 65 33 32 28 61 2c 20 70  fileWrite32(a, p
2a3f0 43 44 53 2d 3e 69 45 78 74 65 72 6e 61 6c 41 74  CDS->iExternalAt
2a400 74 72 29 3b 0a 20 20 7a 69 70 66 69 6c 65 57 72  tr);.  zipfileWr
2a410 69 74 65 33 32 28 61 2c 20 70 43 44 53 2d 3e 69  ite32(a, pCDS->i
2a420 4f 66 66 73 65 74 29 3b 0a 0a 20 20 6d 65 6d 63  Offset);..  memc
2a430 70 79 28 61 2c 20 70 43 44 53 2d 3e 7a 46 69 6c  py(a, pCDS->zFil
2a440 65 2c 20 70 43 44 53 2d 3e 6e 46 69 6c 65 29 3b  e, pCDS->nFile);
2a450 0a 20 20 61 20 2b 3d 20 70 43 44 53 2d 3e 6e 46  .  a += pCDS->nF
2a460 69 6c 65 3b 0a 0a 20 20 69 66 28 20 70 45 6e 74  ile;..  if( pEnt
2a470 72 79 2d 3e 61 45 78 74 72 61 20 29 7b 0a 20 20  ry->aExtra ){.  
2a480 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 70    int n = (int)p
2a490 43 44 53 2d 3e 6e 45 78 74 72 61 20 2b 20 28 69  CDS->nExtra + (i
2a4a0 6e 74 29 70 43 44 53 2d 3e 6e 43 6f 6d 6d 65 6e  nt)pCDS->nCommen
2a4b0 74 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 2c  t;.    memcpy(a,
2a4c0 20 70 45 6e 74 72 79 2d 3e 61 45 78 74 72 61 2c   pEntry->aExtra,
2a4d0 20 6e 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 3b   n);.    a += n;
2a4e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2a4f0 73 65 72 74 28 20 70 43 44 53 2d 3e 6e 45 78 74  sert( pCDS->nExt
2a500 72 61 3d 3d 39 20 29 3b 0a 20 20 20 20 7a 69 70  ra==9 );.    zip
2a510 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 5a  fileWrite16(a, Z
2a520 49 50 46 49 4c 45 5f 45 58 54 52 41 5f 54 49 4d  IPFILE_EXTRA_TIM
2a530 45 53 54 41 4d 50 29 3b 0a 20 20 20 20 7a 69 70  ESTAMP);.    zip
2a540 66 69 6c 65 57 72 69 74 65 31 36 28 61 2c 20 35  fileWrite16(a, 5
2a550 29 3b 0a 20 20 20 20 2a 61 2b 2b 20 3d 20 30 78  );.    *a++ = 0x
2a560 30 31 3b 0a 20 20 20 20 7a 69 70 66 69 6c 65 57  01;.    zipfileW
2a570 72 69 74 65 33 32 28 61 2c 20 70 45 6e 74 72 79  rite32(a, pEntry
2a580 2d 3e 6d 55 6e 69 78 54 69 6d 65 29 3b 0a 20 20  ->mUnixTime);.  
2a590 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 2d 61 42  }..  return a-aB
2a5a0 75 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  uf;.}..static in
2a5b0 74 20 7a 69 70 66 69 6c 65 43 6f 6d 6d 69 74 28  t zipfileCommit(
2a5c0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
2a5d0 74 61 62 29 7b 0a 20 20 5a 69 70 66 69 6c 65 54  tab){.  ZipfileT
2a5e0 61 62 20 2a 70 54 61 62 20 3d 20 28 5a 69 70 66  ab *pTab = (Zipf
2a5f0 69 6c 65 54 61 62 2a 29 70 56 74 61 62 3b 0a 20  ileTab*)pVtab;. 
2a600 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a610 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  _OK;.  if( pTab-
2a620 3e 70 57 72 69 74 65 46 64 20 29 7b 0a 20 20 20  >pWriteFd ){.   
2a630 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 70   i64 iOffset = p
2a640 54 61 62 2d 3e 73 7a 43 75 72 72 65 6e 74 3b 0a  Tab->szCurrent;.
2a650 20 20 20 20 5a 69 70 66 69 6c 65 45 6e 74 72 79      ZipfileEntry
2a660 20 2a 70 3b 0a 20 20 20 20 5a 69 70 66 69 6c 65   *p;.    Zipfile
2a670 45 4f 43 44 20 65 6f 63 64 3b 0a 20 20 20 20 69  EOCD eocd;.    i
2a680 6e 74 20 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 0a  nt nEntry = 0;..
2a690 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
2a6a0 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 2a 2f 0a   all entries */.
2a6b0 20 20 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e      for(p=pTab->
2a6c0 70 46 69 72 73 74 45 6e 74 72 79 3b 20 72 63 3d  pFirstEntry; rc=
2a6d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 3b  =SQLITE_OK && p;
2a6e0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
2a6f0 20 20 20 20 69 6e 74 20 6e 20 3d 20 7a 69 70 66      int n = zipf
2a700 69 6c 65 53 65 72 69 61 6c 69 7a 65 43 44 53 28  ileSerializeCDS(
2a710 70 2c 20 70 54 61 62 2d 3e 61 42 75 66 66 65 72  p, pTab->aBuffer
2a720 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 69  );.      rc = zi
2a730 70 66 69 6c 65 41 70 70 65 6e 64 44 61 74 61 28  pfileAppendData(
2a740 70 54 61 62 2c 20 70 54 61 62 2d 3e 61 42 75 66  pTab, pTab->aBuf
2a750 66 65 72 2c 20 6e 29 3b 0a 20 20 20 20 20 20 6e  fer, n);.      n
2a760 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Entry++;.    }..
2a770 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
2a780 20 74 68 65 20 45 4f 43 44 20 72 65 63 6f 72 64   the EOCD record
2a790 20 2a 2f 0a 20 20 20 20 65 6f 63 64 2e 69 44 69   */.    eocd.iDi
2a7a0 73 6b 20 3d 20 30 3b 0a 20 20 20 20 65 6f 63 64  sk = 0;.    eocd
2a7b0 2e 69 46 69 72 73 74 44 69 73 6b 20 3d 20 30 3b  .iFirstDisk = 0;
2a7c0 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74 72 79  .    eocd.nEntry
2a7d0 20 3d 20 28 75 31 36 29 6e 45 6e 74 72 79 3b 0a   = (u16)nEntry;.
2a7e0 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74 72 79 54      eocd.nEntryT
2a7f0 6f 74 61 6c 20 3d 20 28 75 31 36 29 6e 45 6e 74  otal = (u16)nEnt
2a800 72 79 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 53 69  ry;.    eocd.nSi
2a810 7a 65 20 3d 20 28 75 33 32 29 28 70 54 61 62 2d  ze = (u32)(pTab-
2a820 3e 73 7a 43 75 72 72 65 6e 74 20 2d 20 69 4f 66  >szCurrent - iOf
2a830 66 73 65 74 29 3b 0a 20 20 20 20 65 6f 63 64 2e  fset);.    eocd.
2a840 69 4f 66 66 73 65 74 20 3d 20 28 75 33 32 29 69  iOffset = (u32)i
2a850 4f 66 66 73 65 74 3b 0a 20 20 20 20 72 63 20 3d  Offset;.    rc =
2a860 20 7a 69 70 66 69 6c 65 41 70 70 65 6e 64 45 4f   zipfileAppendEO
2a870 43 44 28 70 54 61 62 2c 20 26 65 6f 63 64 29 3b  CD(pTab, &eocd);
2a880 0a 0a 20 20 20 20 7a 69 70 66 69 6c 65 43 6c 65  ..    zipfileCle
2a890 61 6e 75 70 54 72 61 6e 73 61 63 74 69 6f 6e 28  anupTransaction(
2a8a0 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pTab);.  }.  ret
2a8b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
2a8c0 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 52 6f 6c  c int zipfileRol
2a8d0 6c 62 61 63 6b 28 73 71 6c 69 74 65 33 5f 76 74  lback(sqlite3_vt
2a8e0 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 72 65  ab *pVtab){.  re
2a8f0 74 75 72 6e 20 7a 69 70 66 69 6c 65 43 6f 6d 6d  turn zipfileComm
2a900 69 74 28 70 56 74 61 62 29 3b 0a 7d 0a 0a 73 74  it(pVtab);.}..st
2a910 61 74 69 63 20 5a 69 70 66 69 6c 65 43 73 72 20  atic ZipfileCsr 
2a920 2a 7a 69 70 66 69 6c 65 46 69 6e 64 43 75 72 73  *zipfileFindCurs
2a930 6f 72 28 5a 69 70 66 69 6c 65 54 61 62 20 2a 70  or(ZipfileTab *p
2a940 54 61 62 2c 20 69 36 34 20 69 49 64 29 7b 0a 20  Tab, i64 iId){. 
2a950 20 5a 69 70 66 69 6c 65 43 73 72 20 2a 70 43 73   ZipfileCsr *pCs
2a960 72 3b 0a 20 20 66 6f 72 28 70 43 73 72 3d 70 54  r;.  for(pCsr=pT
2a970 61 62 2d 3e 70 43 73 72 4c 69 73 74 3b 20 70 43  ab->pCsrList; pC
2a980 73 72 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70  sr; pCsr=pCsr->p
2a990 43 73 72 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  CsrNext){.    if
2a9a0 28 20 69 49 64 3d 3d 70 43 73 72 2d 3e 69 49 64  ( iId==pCsr->iId
2a9b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2a9c0 72 65 74 75 72 6e 20 70 43 73 72 3b 0a 7d 0a 0a  return pCsr;.}..
2a9d0 73 74 61 74 69 63 20 76 6f 69 64 20 7a 69 70 66  static void zipf
2a9e0 69 6c 65 46 75 6e 63 74 69 6f 6e 43 64 73 28 0a  ileFunctionCds(.
2a9f0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2aa00 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
2aa10 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
2aa20 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
2aa30 7b 0a 20 20 5a 69 70 66 69 6c 65 43 73 72 20 2a  {.  ZipfileCsr *
2aa40 70 43 73 72 3b 0a 20 20 5a 69 70 66 69 6c 65 54  pCsr;.  ZipfileT
2aa50 61 62 20 2a 70 54 61 62 20 3d 20 28 5a 69 70 66  ab *pTab = (Zipf
2aa60 69 6c 65 54 61 62 2a 29 73 71 6c 69 74 65 33 5f  ileTab*)sqlite3_
2aa70 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
2aa80 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72  t);.  assert( ar
2aa90 67 63 3e 30 20 29 3b 0a 0a 20 20 70 43 73 72 20  gc>0 );..  pCsr 
2aaa0 3d 20 7a 69 70 66 69 6c 65 46 69 6e 64 43 75 72  = zipfileFindCur
2aab0 73 6f 72 28 70 54 61 62 2c 20 73 71 6c 69 74 65  sor(pTab, sqlite
2aac0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
2aad0 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70  gv[0]));.  if( p
2aae0 43 73 72 20 29 7b 0a 20 20 20 20 5a 69 70 66 69  Csr ){.    Zipfi
2aaf0 6c 65 43 44 53 20 2a 70 20 3d 20 26 70 43 73 72  leCDS *p = &pCsr
2ab00 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 63 64 73 3b  ->pCurrent->cds;
2ab10 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 65 73 20  .    char *zRes 
2ab20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2ab30 66 28 22 7b 22 0a 20 20 20 20 20 20 20 20 22 5c  f("{".        "\
2ab40 22 76 65 72 73 69 6f 6e 2d 6d 61 64 65 2d 62 79  "version-made-by
2ab50 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20  \" : %u, ".     
2ab60 20 20 20 22 5c 22 76 65 72 73 69 6f 6e 2d 74 6f     "\"version-to
2ab70 2d 65 78 74 72 61 63 74 5c 22 20 3a 20 25 75 2c  -extract\" : %u,
2ab80 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 66 6c   ".        "\"fl
2ab90 61 67 73 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20  ags\" : %u, ".  
2aba0 20 20 20 20 20 20 22 5c 22 63 6f 6d 70 72 65 73        "\"compres
2abb0 73 69 6f 6e 5c 22 20 3a 20 25 75 2c 20 22 0a 20  sion\" : %u, ". 
2abc0 20 20 20 20 20 20 20 22 5c 22 74 69 6d 65 5c 22         "\"time\"
2abd0 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20 20   : %u, ".       
2abe0 20 22 5c 22 64 61 74 65 5c 22 20 3a 20 25 75 2c   "\"date\" : %u,
2abf0 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 63 72   ".        "\"cr
2ac00 63 33 32 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20  c32\" : %u, ".  
2ac10 20 20 20 20 20 20 22 5c 22 63 6f 6d 70 72 65 73        "\"compres
2ac20 73 65 64 2d 73 69 7a 65 5c 22 20 3a 20 25 75 2c  sed-size\" : %u,
2ac30 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 75 6e   ".        "\"un
2ac40 63 6f 6d 70 72 65 73 73 65 64 2d 73 69 7a 65 5c  compressed-size\
2ac50 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20  " : %u, ".      
2ac60 20 20 22 5c 22 66 69 6c 65 2d 6e 61 6d 65 2d 6c    "\"file-name-l
2ac70 65 6e 67 74 68 5c 22 20 3a 20 25 75 2c 20 22 0a  ength\" : %u, ".
2ac80 20 20 20 20 20 20 20 20 22 5c 22 65 78 74 72 61          "\"extra
2ac90 2d 66 69 65 6c 64 2d 6c 65 6e 67 74 68 5c 22 20  -field-length\" 
2aca0 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20 20 20  : %u, ".        
2acb0 22 5c 22 66 69 6c 65 2d 63 6f 6d 6d 65 6e 74 2d  "\"file-comment-
2acc0 6c 65 6e 67 74 68 5c 22 20 3a 20 25 75 2c 20 22  length\" : %u, "
2acd0 0a 20 20 20 20 20 20 20 20 22 5c 22 64 69 73 6b  .        "\"disk
2ace0 2d 6e 75 6d 62 65 72 2d 73 74 61 72 74 5c 22 20  -number-start\" 
2acf0 3a 20 25 75 2c 20 22 0a 20 20 20 20 20 20 20 20  : %u, ".        
2ad00 22 5c 22 69 6e 74 65 72 6e 61 6c 2d 61 74 74 72  "\"internal-attr
2ad10 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20 20 20 20  \" : %u, ".     
2ad20 20 20 20 22 5c 22 65 78 74 65 72 6e 61 6c 2d 61     "\"external-a
2ad30 74 74 72 5c 22 20 3a 20 25 75 2c 20 22 0a 20 20  ttr\" : %u, ".  
2ad40 20 20 20 20 20 20 22 5c 22 6f 66 66 73 65 74 5c        "\"offset\
2ad50 22 20 3a 20 25 75 20 7d 22 2c 0a 20 20 20 20 20  " : %u }",.     
2ad60 20 20 20 28 75 33 32 29 70 2d 3e 69 56 65 72 73     (u32)p->iVers
2ad70 69 6f 6e 4d 61 64 65 42 79 2c 20 28 75 33 32 29  ionMadeBy, (u32)
2ad80 70 2d 3e 69 56 65 72 73 69 6f 6e 45 78 74 72 61  p->iVersionExtra
2ad90 63 74 2c 0a 20 20 20 20 20 20 20 20 28 75 33 32  ct,.        (u32
2ada0 29 70 2d 3e 66 6c 61 67 73 2c 20 28 75 33 32 29  )p->flags, (u32)
2adb0 70 2d 3e 69 43 6f 6d 70 72 65 73 73 69 6f 6e 2c  p->iCompression,
2adc0 0a 20 20 20 20 20 20 20 20 28 75 33 32 29 70 2d  .        (u32)p-
2add0 3e 6d 54 69 6d 65 2c 20 28 75 33 32 29 70 2d 3e  >mTime, (u32)p->
2ade0 6d 44 61 74 65 2c 0a 20 20 20 20 20 20 20 20 28  mDate,.        (
2adf0 75 33 32 29 70 2d 3e 63 72 63 33 32 2c 20 28 75  u32)p->crc32, (u
2ae00 33 32 29 70 2d 3e 73 7a 43 6f 6d 70 72 65 73 73  32)p->szCompress
2ae10 65 64 2c 0a 20 20 20 20 20 20 20 20 28 75 33 32  ed,.        (u32
2ae20 29 70 2d 3e 73 7a 55 6e 63 6f 6d 70 72 65 73 73  )p->szUncompress
2ae30 65 64 2c 20 28 75 33 32 29 70 2d 3e 6e 46 69 6c  ed, (u32)p->nFil
2ae40 65 2c 0a 20 20 20 20 20 20 20 20 28 75 33 32 29  e,.        (u32)
2ae50 70 2d 3e 6e 45 78 74 72 61 2c 20 28 75 33 32 29  p->nExtra, (u32)
2ae60 70 2d 3e 6e 43 6f 6d 6d 65 6e 74 2c 0a 20 20 20  p->nComment,.   
2ae70 20 20 20 20 20 28 75 33 32 29 70 2d 3e 69 44 69       (u32)p->iDi
2ae80 73 6b 53 74 61 72 74 2c 20 28 75 33 32 29 70 2d  skStart, (u32)p-
2ae90 3e 69 49 6e 74 65 72 6e 61 6c 41 74 74 72 2c 0a  >iInternalAttr,.
2aea0 20 20 20 20 20 20 20 20 28 75 33 32 29 70 2d 3e          (u32)p->
2aeb0 69 45 78 74 65 72 6e 61 6c 41 74 74 72 2c 20 28  iExternalAttr, (
2aec0 75 33 32 29 70 2d 3e 69 4f 66 66 73 65 74 0a 20  u32)p->iOffset. 
2aed0 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a     );..    if( z
2aee0 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Res==0 ){.      
2aef0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2af00 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
2af10 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xt);.    }else{.
2af20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2af30 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
2af40 74 2c 20 7a 52 65 73 2c 20 2d 31 2c 20 53 51 4c  t, zRes, -1, SQL
2af50 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
2af60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2af70 65 65 28 7a 52 65 73 29 3b 0a 20 20 20 20 7d 0a  ee(zRes);.    }.
2af80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 46 69    }.}../*.** xFi
2af90 6e 64 46 75 6e 63 74 69 6f 6e 20 6d 65 74 68 6f  ndFunction metho
2afa0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2afb0 20 7a 69 70 66 69 6c 65 46 69 6e 64 46 75 6e 63   zipfileFindFunc
2afc0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
2afd0 76 74 61 62 20 2a 70 56 74 61 62 2c 20 20 20 20  vtab *pVtab,    
2afe0 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75          /* Virtu
2aff0 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20  al table handle 
2b000 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b030 66 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  f SQL function a
2b040 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 6f  rguments */.  co
2b050 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b070 20 4e 61 6d 65 20 6f 66 20 53 51 4c 20 66 75 6e   Name of SQL fun
2b080 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
2b090 28 2a 2a 70 78 46 75 6e 63 29 28 73 71 6c 69 74  (**pxFunc)(sqlit
2b0a0 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
2b0b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
2b0c0 2c 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74  , /* OUT: Result
2b0d0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 41   */.  void **ppA
2b0e0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
2b0f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 55 73        /* OUT: Us
2b100 65 72 20 64 61 74 61 20 66 6f 72 20 2a 70 78 46  er data for *pxF
2b110 75 6e 63 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  unc */.){.  if( 
2b120 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2b130 22 7a 69 70 66 69 6c 65 5f 63 64 73 22 2c 20 7a  "zipfile_cds", z
2b140 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2b150 2a 70 78 46 75 6e 63 20 3d 20 7a 69 70 66 69 6c  *pxFunc = zipfil
2b160 65 46 75 6e 63 74 69 6f 6e 43 64 73 3b 0a 20 20  eFunctionCds;.  
2b170 20 20 2a 70 70 41 72 67 20 3d 20 28 76 6f 69 64    *ppArg = (void
2b180 2a 29 70 56 74 61 62 3b 0a 20 20 20 20 72 65 74  *)pVtab;.    ret
2b190 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
2b1a0 75 72 6e 20 30 3b 0a 7d 0a 0a 74 79 70 65 64 65  urn 0;.}..typede
2b1b0 66 20 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65  f struct Zipfile
2b1c0 42 75 66 66 65 72 20 5a 69 70 66 69 6c 65 42 75  Buffer ZipfileBu
2b1d0 66 66 65 72 3b 0a 73 74 72 75 63 74 20 5a 69 70  ffer;.struct Zip
2b1e0 66 69 6c 65 42 75 66 66 65 72 20 7b 0a 20 20 75  fileBuffer {.  u
2b1f0 38 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 20  8 *a;           
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b210 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
2b220 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  fer */.  int n; 
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b240 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b250 20 6f 66 20 62 75 66 66 65 72 20 69 6e 20 62 79   of buffer in by
2b260 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  tes */.  int nAl
2b270 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
2b280 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2b290 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 61 5b   allocated at a[
2b2a0 5d 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  ] */.};..typedef
2b2b0 20 73 74 72 75 63 74 20 5a 69 70 66 69 6c 65 43   struct ZipfileC
2b2c0 74 78 20 5a 69 70 66 69 6c 65 43 74 78 3b 0a 73  tx ZipfileCtx;.s
2b2d0 74 72 75 63 74 20 5a 69 70 66 69 6c 65 43 74 78  truct ZipfileCtx
2b2e0 20 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b   {.  int nEntry;
2b2f0 0a 20 20 5a 69 70 66 69 6c 65 42 75 66 66 65 72  .  ZipfileBuffer
2b300 20 62 6f 64 79 3b 0a 20 20 5a 69 70 66 69 6c 65   body;.  Zipfile
2b310 42 75 66 66 65 72 20 63 64 73 3b 0a 7d 3b 0a 0a  Buffer cds;.};..
2b320 73 74 61 74 69 63 20 69 6e 74 20 7a 69 70 66 69  static int zipfi
2b330 6c 65 42 75 66 66 65 72 47 72 6f 77 28 5a 69 70  leBufferGrow(Zip
2b340 66 69 6c 65 42 75 66 66 65 72 20 2a 70 42 75 66  fileBuffer *pBuf
2b350 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
2b360 69 66 28 20 70 42 75 66 2d 3e 6e 2b 6e 42 79 74  if( pBuf->n+nByt
2b370 65 3e 70 42 75 66 2d 3e 6e 41 6c 6c 6f 63 20 29  e>pBuf->nAlloc )
2b380 7b 0a 20 20 20 20 75 38 20 2a 61 4e 65 77 3b 0a  {.    u8 *aNew;.
2b390 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2b3a0 34 20 6e 4e 65 77 20 3d 20 70 42 75 66 2d 3e 6e  4 nNew = pBuf->n
2b3b0 20 3f 20 70 42 75 66 2d 3e 6e 2a 32 20 3a 20 35   ? pBuf->n*2 : 5
2b3c0 31 32 3b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71  12;.    int nReq
2b3d0 20 3d 20 70 42 75 66 2d 3e 6e 20 2b 20 6e 42 79   = pBuf->n + nBy
2b3e0 74 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  te;..    while( 
2b3f0 6e 4e 65 77 3c 6e 52 65 71 20 29 20 6e 4e 65 77  nNew<nReq ) nNew
2b400 20 3d 20 6e 4e 65 77 2a 32 3b 0a 20 20 20 20 61   = nNew*2;.    a
2b410 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
2b420 61 6c 6c 6f 63 36 34 28 70 42 75 66 2d 3e 61 2c  alloc64(pBuf->a,
2b430 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20   nNew);.    if( 
2b440 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
2b450 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2b460 20 20 20 70 42 75 66 2d 3e 61 20 3d 20 61 4e 65     pBuf->a = aNe
2b470 77 3b 0a 20 20 20 20 70 42 75 66 2d 3e 6e 41 6c  w;.    pBuf->nAl
2b480 6c 6f 63 20 3d 20 28 69 6e 74 29 6e 4e 65 77 3b  loc = (int)nNew;
2b490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2b4a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2b4b0 2a 20 78 53 74 65 70 28 29 20 63 61 6c 6c 62 61  * xStep() callba
2b4c0 63 6b 20 66 6f 72 20 74 68 65 20 7a 69 70 66 69  ck for the zipfi
2b4d0 6c 65 28 29 20 61 67 67 72 65 67 61 74 65 2e 20  le() aggregate. 
2b4e0 54 68 69 73 20 63 61 6e 20 62 65 20 63 61 6c 6c  This can be call
2b4f0 65 64 20 69 6e 0a 2a 2a 20 61 6e 79 20 6f 66 20  ed in.** any of 
2b500 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61  the following wa
2b510 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  ys:.**.**   SELE
2b520 43 54 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65 2c  CT zipfile(name,
2b530 64 61 74 61 29 20 2e 2e 2e 0a 2a 2a 20 20 20 53  data) ....**   S
2b540 45 4c 45 43 54 20 7a 69 70 66 69 6c 65 28 6e 61  ELECT zipfile(na
2b550 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64 61  me,mode,mtime,da
2b560 74 61 29 20 2e 2e 2e 0a 2a 2a 20 20 20 53 45 4c  ta) ....**   SEL
2b570 45 43 54 20 7a 69 70 66 69 6c 65 28 6e 61 6d 65  ECT zipfile(name
2b580 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64 61 74 61  ,mode,mtime,data
2b590 2c 6d 65 74 68 6f 64 29 20 2e 2e 2e 0a 2a 2f 0a  ,method) ....*/.
2b5a0 76 6f 69 64 20 7a 69 70 66 69 6c 65 53 74 65 70  void zipfileStep
2b5b0 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2b5c0 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 56 61 6c   *pCtx, int nVal
2b5d0 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
2b5e0 2a 2a 61 70 56 61 6c 29 7b 0a 20 20 5a 69 70 66  **apVal){.  Zipf
2b5f0 69 6c 65 43 74 78 20 2a 70 3b 20 20 20 20 20 20  ileCtx *p;      
2b600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2b610 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2b620 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 5a  n context */.  Z
2b630 69 70 66 69 6c 65 45 6e 74 72 79 20 65 3b 20 20  ipfileEntry e;  
2b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b650 2a 20 4e 65 77 20 65 6e 74 72 79 20 74 6f 20 61  * New entry to a
2b660 64 64 20 74 6f 20 7a 69 70 20 61 72 63 68 69 76  dd to zip archiv
2b670 65 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f  e */..  sqlite3_
2b680 76 61 6c 75 65 20 2a 70 4e 61 6d 65 20 3d 20 30  value *pName = 0
2b690 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
2b6a0 65 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  e *pMode = 0;.  
2b6b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
2b6c0 4d 74 69 6d 65 20 3d 20 30 3b 0a 20 20 73 71 6c  Mtime = 0;.  sql
2b6d0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 44 61 74  ite3_value *pDat
2b6e0 61 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  a = 0;.  sqlite3
2b6f0 5f 76 61 6c 75 65 20 2a 70 4d 65 74 68 6f 64 20  _value *pMethod 
2b700 3d 20 30 3b 0a 0a 20 20 69 6e 74 20 62 49 73 44  = 0;..  int bIsD
2b710 69 72 20 3d 20 30 3b 0a 20 20 75 33 32 20 6d 6f  ir = 0;.  u32 mo
2b720 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
2b730 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
2b740 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69   *zErr = 0;..  i
2b750 6e 74 20 69 4d 65 74 68 6f 64 20 3d 20 2d 31 3b  nt iMethod = -1;
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b770 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 6d 65  * Compression me
2b780 74 68 6f 64 20 74 6f 20 75 73 65 20 28 30 20 6f  thod to use (0 o
2b790 72 20 38 29 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74  r 8) */..  const
2b7a0 20 75 38 20 2a 61 44 61 74 61 20 3d 20 30 3b 20   u8 *aData = 0; 
2b7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b7c0 73 73 69 62 6c 79 20 63 6f 6d 70 72 65 73 73 65  ssibly compresse
2b7d0 64 20 64 61 74 61 20 66 6f 72 20 6e 65 77 20 65  d data for new e
2b7e0 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ntry */.  int nD
2b7f0 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ata = 0;        
2b800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2b810 65 20 6f 66 20 61 44 61 74 61 5b 5d 20 69 6e 20  e of aData[] in 
2b820 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73  bytes */.  int s
2b830 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64 20 3d 20  zUncompressed = 
2b840 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  0;         /* Si
2b850 7a 65 20 6f 66 20 64 61 74 61 20 62 65 66 6f 72  ze of data befor
2b860 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f  e compression */
2b870 0a 20 20 75 38 20 2a 61 46 72 65 65 20 3d 20 30  .  u8 *aFree = 0
2b880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b890 20 20 20 2f 2a 20 46 72 65 65 20 74 68 69 73 20     /* Free this 
2b8a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2b8b0 20 2a 2f 0a 20 20 75 33 32 20 69 43 72 63 33 32   */.  u32 iCrc32
2b8c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2b8d0 20 20 20 20 20 20 2f 2a 20 63 72 63 33 32 20 6f        /* crc32 o
2b8e0 66 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 20 64  f uncompressed d
2b8f0 61 74 61 20 2a 2f 0a 0a 20 20 63 68 61 72 20 2a  ata */..  char *
2b900 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  zName = 0;      
2b910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2b920 68 20 28 6e 61 6d 65 29 20 6f 66 20 6e 65 77 20  h (name) of new 
2b930 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  entry */.  int n
2b940 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Name = 0;       
2b950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2b960 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62  ze of zName in b
2b970 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
2b980 7a 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20  zFree = 0;      
2b990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
2b9a0 65 20 74 68 69 73 20 62 65 66 6f 72 65 20 72 65  e this before re
2b9b0 74 75 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  turning */.  int
2b9c0 20 6e 42 79 74 65 3b 0a 0a 20 20 6d 65 6d 73 65   nByte;..  memse
2b9d0 74 28 26 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&e, 0, sizeof(
2b9e0 65 29 29 3b 0a 20 20 70 20 3d 20 28 5a 69 70 66  e));.  p = (Zipf
2b9f0 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
2ba00 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2ba10 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 5a  t(pCtx, sizeof(Z
2ba20 69 70 66 69 6c 65 43 74 78 29 29 3b 0a 20 20 69  ipfileCtx));.  i
2ba30 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2ba40 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20  ;..  /* Martial 
2ba50 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  the arguments in
2ba60 74 6f 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  to stack variabl
2ba70 65 73 20 2a 2f 0a 20 20 69 66 28 20 6e 56 61 6c  es */.  if( nVal
2ba80 21 3d 32 20 26 26 20 6e 56 61 6c 21 3d 34 20 26  !=2 && nVal!=4 &
2ba90 26 20 6e 56 61 6c 21 3d 35 20 29 7b 0a 20 20 20  & nVal!=5 ){.   
2baa0 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
2bab0 6d 70 72 69 6e 74 66 28 22 77 72 6f 6e 67 20 6e  mprintf("wrong n
2bac0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2bad0 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 7a  ts to function z
2bae0 69 70 66 69 6c 65 28 29 22 29 3b 0a 20 20 20 20  ipfile()");.    
2baf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2bb00 52 3b 0a 20 20 20 20 67 6f 74 6f 20 7a 69 70 66  R;.    goto zipf
2bb10 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a 20 20  ile_step_out;.  
2bb20 7d 0a 20 20 70 4e 61 6d 65 20 3d 20 61 70 56 61  }.  pName = apVa
2bb30 6c 5b 30 5d 3b 0a 20 20 69 66 28 20 6e 56 61 6c  l[0];.  if( nVal
2bb40 3d 3d 32 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==2 ){.    pData
2bb50 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 7d   = apVal[1];.  }
2bb60 65 6c 73 65 7b 0a 20 20 20 20 70 4d 6f 64 65 20  else{.    pMode 
2bb70 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20  = apVal[1];.    
2bb80 70 4d 74 69 6d 65 20 3d 20 61 70 56 61 6c 5b 32  pMtime = apVal[2
2bb90 5d 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 61  ];.    pData = a
2bba0 70 56 61 6c 5b 33 5d 3b 0a 20 20 20 20 69 66 28  pVal[3];.    if(
2bbb0 20 6e 56 61 6c 3d 3d 35 20 29 7b 0a 20 20 20 20   nVal==5 ){.    
2bbc0 20 20 70 4d 65 74 68 6f 64 20 3d 20 61 70 56 61    pMethod = apVa
2bbd0 6c 5b 34 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l[4];.    }.  }.
2bbe0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2bbf0 20 74 68 65 20 27 6e 61 6d 65 27 20 70 61 72 61   the 'name' para
2bc00 6d 65 74 65 72 20 6c 6f 6f 6b 73 20 6f 6b 2e 20  meter looks ok. 
2bc10 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 28 63 68  */.  zName = (ch
2bc20 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2bc30 65 5f 74 65 78 74 28 70 4e 61 6d 65 29 3b 0a 20  e_text(pName);. 
2bc40 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
2bc50 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 4e 61  _value_bytes(pNa
2bc60 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
2bc70 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 45 72 72 20  ==0 ){.    zErr 
2bc80 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2bc90 66 28 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  f("first argumen
2bca0 74 20 74 6f 20 7a 69 70 66 69 6c 65 28 29 20 6d  t to zipfile() m
2bcb0 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 22  ust be non-NULL"
2bcc0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2bcd0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f  TE_ERROR;.    go
2bce0 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74 65 70 5f  to zipfile_step_
2bcf0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  out;.  }..  /* I
2bd00 6e 73 70 65 63 74 20 74 68 65 20 27 6d 65 74 68  nspect the 'meth
2bd10 6f 64 27 20 70 61 72 61 6d 65 74 65 72 2e 20 54  od' parameter. T
2bd20 68 69 73 20 6d 75 73 74 20 62 65 20 65 69 74 68  his must be eith
2bd30 65 72 20 30 20 28 73 74 6f 72 65 29 2c 20 38 20  er 0 (store), 8 
2bd40 28 75 73 65 0a 20 20 2a 2a 20 64 65 66 6c 61 74  (use.  ** deflat
2bd50 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 29 20 6f  e compression) o
2bd60 72 20 4e 55 4c 4c 20 28 63 68 6f 6f 73 65 20 61  r NULL (choose a
2bd70 75 74 6f 6d 61 74 69 63 61 6c 6c 79 29 2e 20 20  utomatically).  
2bd80 2a 2f 0a 20 20 69 66 28 20 70 4d 65 74 68 6f 64  */.  if( pMethod
2bd90 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   && SQLITE_NULL!
2bda0 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
2bdb0 79 70 65 28 70 4d 65 74 68 6f 64 29 20 29 7b 0a  ype(pMethod) ){.
2bdc0 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 28 69      iMethod = (i
2bdd0 6e 74 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt)sqlite3_value
2bde0 5f 69 6e 74 36 34 28 70 4d 65 74 68 6f 64 29 3b  _int64(pMethod);
2bdf0 0a 20 20 20 20 69 66 28 20 69 4d 65 74 68 6f 64  .    if( iMethod
2be00 21 3d 30 20 26 26 20 69 4d 65 74 68 6f 64 21 3d  !=0 && iMethod!=
2be10 38 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  8 ){.      zErr 
2be20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2be30 66 28 22 69 6c 6c 65 67 61 6c 20 6d 65 74 68 6f  f("illegal metho
2be40 64 20 76 61 6c 75 65 3a 20 25 64 22 2c 20 69 4d  d value: %d", iM
2be50 65 74 68 6f 64 29 3b 0a 20 20 20 20 20 20 72 63  ethod);.      rc
2be60 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2be70 0a 20 20 20 20 20 20 67 6f 74 6f 20 7a 69 70 66  .      goto zipf
2be80 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a 20 20  ile_step_out;.  
2be90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
2bea0 77 20 69 6e 73 70 65 63 74 20 74 68 65 20 64 61  w inspect the da
2beb0 74 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 4e  ta. If this is N
2bec0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ULL, then the ne
2bed0 77 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 20  w entry must be 
2bee0 61 0a 20 20 2a 2a 20 64 69 72 65 63 74 6f 72 79  a.  ** directory
2bef0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 66 69  .  Otherwise, fi
2bf00 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
2bf10 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
2bf20 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 62 65 20   should.  ** be 
2bf30 64 65 66 6c 61 74 65 64 20 6f 72 20 73 69 6d 70  deflated or simp
2bf40 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ly stored in the
2bf50 20 7a 69 70 20 61 72 63 68 69 76 65 2e 20 2a 2f   zip archive. */
2bf60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
2bf70 61 6c 75 65 5f 74 79 70 65 28 70 44 61 74 61 29  alue_type(pData)
2bf80 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
2bf90 0a 20 20 20 20 62 49 73 44 69 72 20 3d 20 31 3b  .    bIsDir = 1;
2bfa0 0a 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 30  .    iMethod = 0
2bfb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2bfc0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 76  Data = sqlite3_v
2bfd0 61 6c 75 65 5f 62 6c 6f 62 28 70 44 61 74 61 29  alue_blob(pData)
2bfe0 3b 0a 20 20 20 20 73 7a 55 6e 63 6f 6d 70 72 65  ;.    szUncompre
2bff0 73 73 65 64 20 3d 20 6e 44 61 74 61 20 3d 20 73  ssed = nData = s
2c000 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2c010 65 73 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69  es(pData);.    i
2c020 43 72 63 33 32 20 3d 20 63 72 63 33 32 28 30 2c  Crc32 = crc32(0,
2c030 20 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   aData, nData);.
2c040 20 20 20 20 69 66 28 20 69 4d 65 74 68 6f 64 3c      if( iMethod<
2c050 30 20 7c 7c 20 69 4d 65 74 68 6f 64 3d 3d 38 20  0 || iMethod==8 
2c060 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 75  ){.      int nOu
2c070 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
2c080 3d 20 7a 69 70 66 69 6c 65 44 65 66 6c 61 74 65  = zipfileDeflate
2c090 28 61 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 26  (aData, nData, &
2c0a0 61 46 72 65 65 2c 20 26 6e 4f 75 74 2c 20 26 7a  aFree, &nOut, &z
2c0b0 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
2c0c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c0d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 7a 69  .        goto zi
2c0e0 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a  pfile_step_out;.
2c0f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2c100 28 20 69 4d 65 74 68 6f 64 3d 3d 38 20 7c 7c 20  ( iMethod==8 || 
2c110 6e 4f 75 74 3c 6e 44 61 74 61 20 29 7b 0a 20 20  nOut<nData ){.  
2c120 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 61 46        aData = aF
2c130 72 65 65 3b 0a 20 20 20 20 20 20 20 20 6e 44 61  ree;.        nDa
2c140 74 61 20 3d 20 6e 4f 75 74 3b 0a 20 20 20 20 20  ta = nOut;.     
2c150 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 38 3b 0a     iMethod = 8;.
2c160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c170 20 20 20 20 20 69 4d 65 74 68 6f 64 20 3d 20 30       iMethod = 0
2c180 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c190 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 63 6f 64 65    }..  /* Decode
2c1a0 20 74 68 65 20 22 6d 6f 64 65 22 20 61 72 67 75   the "mode" argu
2c1b0 6d 65 6e 74 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ment. */.  rc = 
2c1c0 7a 69 70 66 69 6c 65 47 65 74 4d 6f 64 65 28 70  zipfileGetMode(p
2c1d0 4d 6f 64 65 2c 20 62 49 73 44 69 72 2c 20 26 6d  Mode, bIsDir, &m
2c1e0 6f 64 65 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  ode, &zErr);.  i
2c1f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 7a 69 70  f( rc ) goto zip
2c200 66 69 6c 65 5f 73 74 65 70 5f 6f 75 74 3b 0a 0a  file_step_out;..
2c210 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
2c220 22 6d 74 69 6d 65 22 20 61 72 67 75 6d 65 6e 74  "mtime" argument
2c230 2e 20 2a 2f 0a 20 20 65 2e 6d 55 6e 69 78 54 69  . */.  e.mUnixTi
2c240 6d 65 20 3d 20 7a 69 70 66 69 6c 65 47 65 74 54  me = zipfileGetT
2c250 69 6d 65 28 70 4d 74 69 6d 65 29 3b 0a 0a 20 20  ime(pMtime);..  
2c260 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2c270 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 2c  directory entry,
2c280 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
2c290 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
2c2a0 65 20 27 2f 27 0a 20 20 2a 2a 20 61 74 20 74 68  e '/'.  ** at th
2c2b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 74  e end of the pat
2c2c0 68 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  h. Or, if this i
2c2d0 73 20 6e 6f 74 20 61 20 64 69 72 65 63 74 6f 72  s not a director
2c2e0 79 20 61 6e 64 20 74 68 65 20 70 61 74 68 0a 20  y and the path. 
2c2f0 20 2a 2a 20 65 6e 64 73 20 69 6e 20 27 2f 27 20   ** ends in '/' 
2c300 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  it is an error. 
2c310 2a 2f 0a 20 20 69 66 28 20 62 49 73 44 69 72 3d  */.  if( bIsDir=
2c320 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 4e  =0 ){.    if( zN
2c330 61 6d 65 5b 6e 4e 61 6d 65 2d 31 5d 3d 3d 27 2f  ame[nName-1]=='/
2c340 27 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  ' ){.      zErr 
2c350 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2c360 66 28 22 6e 6f 6e 2d 64 69 72 65 63 74 6f 72 79  f("non-directory
2c370 20 6e 61 6d 65 20 6d 75 73 74 20 6e 6f 74 20 65   name must not e
2c380 6e 64 20 77 69 74 68 20 2f 22 29 3b 0a 20 20 20  nd with /");.   
2c390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2c3a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RROR;.      goto
2c3b0 20 7a 69 70 66 69 6c 65 5f 73 74 65 70 5f 6f 75   zipfile_step_ou
2c3c0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
2c3d0 7b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b  {.    if( zName[
2c3e0 6e 4e 61 6d 65 2d 31 5d 21 3d 27 2f 27 20 29 7b  nName-1]!='/' ){
2c3f0 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  .      zName = z
2c400 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Free = sqlite3_m
2c410 70 72 69 6e 74 66 28 22 25 73 2f 22 2c 20 7a 4e  printf("%s/", zN
2c420 61 6d 65 29 3b 0a 20 20 20 20 20 20 6e 4e 61 6d  ame);.      nNam
2c430 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  e++;.      if( z
2c440 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2c450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c460 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f  OMEM;.        go
2c470 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74 65 70 5f  to zipfile_step_
2c480 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
2c490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68   }else{.      wh
2c4a0 69 6c 65 28 20 6e 4e 61 6d 65 3e 31 20 26 26 20  ile( nName>1 && 
2c4b0 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2d 32 5d 3d 3d  zName[nName-2]==
2c4c0 27 2f 27 20 29 20 6e 4e 61 6d 65 2d 2d 3b 0a 20  '/' ) nName--;. 
2c4d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
2c4e0 73 73 65 6d 62 6c 65 20 74 68 65 20 5a 69 70 66  ssemble the Zipf
2c4f0 69 6c 65 45 6e 74 72 79 20 6f 62 6a 65 63 74 20  ileEntry object 
2c500 66 6f 72 20 74 68 65 20 6e 65 77 20 7a 69 70 20  for the new zip 
2c510 61 72 63 68 69 76 65 20 65 6e 74 72 79 20 2a 2f  archive entry */
2c520 0a 20 20 65 2e 63 64 73 2e 69 56 65 72 73 69 6f  .  e.cds.iVersio
2c530 6e 4d 61 64 65 42 79 20 3d 20 5a 49 50 46 49 4c  nMadeBy = ZIPFIL
2c540 45 5f 4e 45 57 45 4e 54 52 59 5f 4d 41 44 45 42  E_NEWENTRY_MADEB
2c550 59 3b 0a 20 20 65 2e 63 64 73 2e 69 56 65 72 73  Y;.  e.cds.iVers
2c560 69 6f 6e 45 78 74 72 61 63 74 20 3d 20 5a 49 50  ionExtract = ZIP
2c570 46 49 4c 45 5f 4e 45 57 45 4e 54 52 59 5f 52 45  FILE_NEWENTRY_RE
2c580 51 55 49 52 45 44 3b 0a 20 20 65 2e 63 64 73 2e  QUIRED;.  e.cds.
2c590 66 6c 61 67 73 20 3d 20 5a 49 50 46 49 4c 45 5f  flags = ZIPFILE_
2c5a0 4e 45 57 45 4e 54 52 59 5f 46 4c 41 47 53 3b 0a  NEWENTRY_FLAGS;.
2c5b0 20 20 65 2e 63 64 73 2e 69 43 6f 6d 70 72 65 73    e.cds.iCompres
2c5c0 73 69 6f 6e 20 3d 20 28 75 31 36 29 69 4d 65 74  sion = (u16)iMet
2c5d0 68 6f 64 3b 0a 20 20 7a 69 70 66 69 6c 65 4d 74  hod;.  zipfileMt
2c5e0 69 6d 65 54 6f 44 6f 73 28 26 65 2e 63 64 73 2c  imeToDos(&e.cds,
2c5f0 20 28 75 33 32 29 65 2e 6d 55 6e 69 78 54 69 6d   (u32)e.mUnixTim
2c600 65 29 3b 0a 20 20 65 2e 63 64 73 2e 63 72 63 33  e);.  e.cds.crc3
2c610 32 20 3d 20 69 43 72 63 33 32 3b 0a 20 20 65 2e  2 = iCrc32;.  e.
2c620 63 64 73 2e 73 7a 43 6f 6d 70 72 65 73 73 65 64  cds.szCompressed
2c630 20 3d 20 6e 44 61 74 61 3b 0a 20 20 65 2e 63 64   = nData;.  e.cd
2c640 73 2e 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65 64  s.szUncompressed
2c650 20 3d 20 73 7a 55 6e 63 6f 6d 70 72 65 73 73 65   = szUncompresse
2c660 64 3b 0a 20 20 65 2e 63 64 73 2e 69 45 78 74 65  d;.  e.cds.iExte
2c670 72 6e 61 6c 41 74 74 72 20 3d 20 28 6d 6f 64 65  rnalAttr = (mode
2c680 3c 3c 31 36 29 3b 0a 20 20 65 2e 63 64 73 2e 69  <<16);.  e.cds.i
2c690 4f 66 66 73 65 74 20 3d 20 70 2d 3e 62 6f 64 79  Offset = p->body
2c6a0 2e 6e 3b 0a 20 20 65 2e 63 64 73 2e 6e 46 69 6c  .n;.  e.cds.nFil
2c6b0 65 20 3d 20 28 75 31 36 29 6e 4e 61 6d 65 3b 0a  e = (u16)nName;.
2c6c0 20 20 65 2e 63 64 73 2e 7a 46 69 6c 65 20 3d 20    e.cds.zFile = 
2c6d0 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 41 70 70  zName;..  /* App
2c6e0 65 6e 64 20 74 68 65 20 4c 46 48 20 74 6f 20 74  end the LFH to t
2c6f0 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 6e  he body of the n
2c700 65 77 20 61 72 63 68 69 76 65 20 2a 2f 0a 20 20  ew archive */.  
2c710 6e 42 79 74 65 20 3d 20 5a 49 50 46 49 4c 45 5f  nByte = ZIPFILE_
2c720 4c 46 48 5f 46 49 58 45 44 5f 53 5a 20 2b 20 65  LFH_FIXED_SZ + e
2c730 2e 63 64 73 2e 6e 46 69 6c 65 20 2b 20 39 3b 0a  .cds.nFile + 9;.
2c740 20 20 69 66 28 20 28 72 63 20 3d 20 7a 69 70 66    if( (rc = zipf
2c750 69 6c 65 42 75 66 66 65 72 47 72 6f 77 28 26 70  ileBufferGrow(&p
2c760 2d 3e 62 6f 64 79 2c 20 6e 42 79 74 65 29 29 20  ->body, nByte)) 
2c770 29 20 67 6f 74 6f 20 7a 69 70 66 69 6c 65 5f 73  ) goto zipfile_s
2c780 74 65 70 5f 6f 75 74 3b 0a 20 20 70 2d 3e 62 6f  tep_out;.  p->bo
2c790 64 79 2e 6e 20 2b 3d 20 7a 69 70 66 69 6c 65 53  dy.n += zipfileS
2c7a0 65 72 69 61 6c 69 7a 65 4c 46 48 28 26 65 2c 20  erializeLFH(&e, 
2c7b0 26 70 2d 3e 62 6f 64 79 2e 61 5b 70 2d 3e 62 6f  &p->body.a[p->bo
2c7c0 64 79 2e 6e 5d 29 3b 0a 0a 20 20 2f 2a 20 41 70  dy.n]);..  /* Ap
2c7d0 70 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f  pend the data to
2c7e0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
2c7f0 20 6e 65 77 20 61 72 63 68 69 76 65 20 2a 2f 0a   new archive */.
2c800 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20 29 7b    if( nData>0 ){
2c810 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 7a  .    if( (rc = z
2c820 69 70 66 69 6c 65 42 75 66 66 65 72 47 72 6f 77  ipfileBufferGrow
2c830 28 26 70 2d 3e 62 6f 64 79 2c 20 6e 44 61 74 61  (&p->body, nData
2c840 29 29 20 29 20 67 6f 74 6f 20 7a 69 70 66 69 6c  )) ) goto zipfil
2c850 65 5f 73 74 65 70 5f 6f 75 74 3b 0a 20 20 20 20  e_step_out;.    
2c860 6d 65 6d 63 70 79 28 26 70 2d 3e 62 6f 64 79 2e  memcpy(&p->body.
2c870 61 5b 70 2d 3e 62 6f 64 79 2e 6e 5d 2c 20 61 44  a[p->body.n], aD
2c880 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
2c890 20 70 2d 3e 62 6f 64 79 2e 6e 20 2b 3d 20 6e 44   p->body.n += nD
2c8a0 61 74 61 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ata;.  }..  /* A
2c8b0 70 70 65 6e 64 20 74 68 65 20 43 44 53 20 72 65  ppend the CDS re
2c8c0 63 6f 72 64 20 74 6f 20 74 68 65 20 64 69 72 65  cord to the dire
2c8d0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 6e 65 77  ctory of the new
2c8e0 20 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 6e 42   archive */.  nB
2c8f0 79 74 65 20 3d 20 5a 49 50 46 49 4c 45 5f 43 44  yte = ZIPFILE_CD
2c900 53 5f 46 49 58 45 44 5f 53 5a 20 2b 20 65 2e 63  S_FIXED_SZ + e.c
2c910 64 73 2e 6e 46 69 6c 65 20 2b 20 39 3b 0a 20 20  ds.nFile + 9;.  
2c920 69 66 28 20 28 72 63 20 3d 20 7a 69 70 66 69 6c  if( (rc = zipfil
2c930 65 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  eBufferGrow(&p->
2c940 63 64 73 2c 20 6e 42 79 74 65 29 29 20 29 20 67  cds, nByte)) ) g
2c950 6f 74 6f 20 7a 69 70 66 69 6c 65 5f 73 74 65 70  oto zipfile_step
2c960 5f 6f 75 74 3b 0a 20 20 70 2d 3e 63 64 73 2e 6e  _out;.  p->cds.n
2c970 20 2b 3d 20 7a 69 70 66 69 6c 65 53 65 72 69 61   += zipfileSeria
2c980 6c 69 7a 65 43 44 53 28 26 65 2c 20 26 70 2d 3e  lizeCDS(&e, &p->
2c990 63 64 73 2e 61 5b 70 2d 3e 63 64 73 2e 6e 5d 29  cds.a[p->cds.n])
2c9a0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
2c9b0 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 65  t the count of e
2c9c0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 61 72  ntries in the ar
2c9d0 63 68 69 76 65 20 2a 2f 0a 20 20 70 2d 3e 6e 45  chive */.  p->nE
2c9e0 6e 74 72 79 2b 2b 3b 0a 0a 20 7a 69 70 66 69 6c  ntry++;.. zipfil
2c9f0 65 5f 73 74 65 70 5f 6f 75 74 3a 0a 20 20 73 71  e_step_out:.  sq
2ca00 6c 69 74 65 33 5f 66 72 65 65 28 61 46 72 65 65  lite3_free(aFree
2ca10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2ca20 65 28 7a 46 72 65 65 29 3b 0a 20 20 69 66 28 20  e(zFree);.  if( 
2ca30 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 45  rc ){.    if( zE
2ca40 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rr ){.      sqli
2ca50 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2ca60 28 70 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29  (pCtx, zErr, -1)
2ca70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ca80 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2ca90 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
2caa0 78 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  x, rc);.    }.  
2cab0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
2cac0 28 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zErr);.}../*.**
2cad0 20 78 46 69 6e 61 6c 69 7a 65 28 29 20 63 61 6c   xFinalize() cal
2cae0 6c 62 61 63 6b 20 66 6f 72 20 7a 69 70 66 69 6c  lback for zipfil
2caf0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
2cb00 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 7a 69  tion..*/.void zi
2cb10 70 66 69 6c 65 46 69 6e 61 6c 28 73 71 6c 69 74  pfileFinal(sqlit
2cb20 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2cb30 29 7b 0a 20 20 5a 69 70 66 69 6c 65 43 74 78 20  ){.  ZipfileCtx 
2cb40 2a 70 3b 0a 20 20 5a 69 70 66 69 6c 65 45 4f 43  *p;.  ZipfileEOC
2cb50 44 20 65 6f 63 64 3b 0a 20 20 73 71 6c 69 74 65  D eocd;.  sqlite
2cb60 33 5f 69 6e 74 36 34 20 6e 5a 69 70 3b 0a 20 20  3_int64 nZip;.  
2cb70 75 38 20 2a 61 5a 69 70 3b 0a 0a 20 20 70 20 3d  u8 *aZip;..  p =
2cb80 20 28 5a 69 70 66 69 6c 65 43 74 78 2a 29 73 71   (ZipfileCtx*)sq
2cb90 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
2cba0 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
2cbb0 7a 65 6f 66 28 5a 69 70 66 69 6c 65 43 74 78 29  zeof(ZipfileCtx)
2cbc0 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
2cbd0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
2cbe0 3e 6e 45 6e 74 72 79 3e 30 20 29 7b 0a 20 20 20  >nEntry>0 ){.   
2cbf0 20 6d 65 6d 73 65 74 28 26 65 6f 63 64 2c 20 30   memset(&eocd, 0
2cc00 2c 20 73 69 7a 65 6f 66 28 65 6f 63 64 29 29 3b  , sizeof(eocd));
2cc10 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74 72 79  .    eocd.nEntry
2cc20 20 3d 20 28 75 31 36 29 70 2d 3e 6e 45 6e 74 72   = (u16)p->nEntr
2cc30 79 3b 0a 20 20 20 20 65 6f 63 64 2e 6e 45 6e 74  y;.    eocd.nEnt
2cc40 72 79 54 6f 74 61 6c 20 3d 20 28 75 31 36 29 70  ryTotal = (u16)p
2cc50 2d 3e 6e 45 6e 74 72 79 3b 0a 20 20 20 20 65 6f  ->nEntry;.    eo
2cc60 63 64 2e 6e 53 69 7a 65 20 3d 20 70 2d 3e 63 64  cd.nSize = p->cd
2cc70 73 2e 6e 3b 0a 20 20 20 20 65 6f 63 64 2e 69 4f  s.n;.    eocd.iO
2cc80 66 66 73 65 74 20 3d 20 70 2d 3e 62 6f 64 79 2e  ffset = p->body.
2cc90 6e 3b 0a 0a 20 20 20 20 6e 5a 69 70 20 3d 20 70  n;..    nZip = p
2cca0 2d 3e 62 6f 64 79 2e 6e 20 2b 20 70 2d 3e 63 64  ->body.n + p->cd
2ccb0 73 2e 6e 20 2b 20 5a 49 50 46 49 4c 45 5f 45 4f  s.n + ZIPFILE_EO
2ccc0 43 44 5f 46 49 58 45 44 5f 53 5a 3b 0a 20 20 20  CD_FIXED_SZ;.   
2ccd0 20 61 5a 69 70 20 3d 20 28 75 38 2a 29 73 71 6c   aZip = (u8*)sql
2cce0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 5a  ite3_malloc64(nZ
2ccf0 69 70 29 3b 0a 20 20 20 20 69 66 28 20 61 5a 69  ip);.    if( aZi
2cd00 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
2cd10 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2cd20 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a  or_nomem(pCtx);.
2cd30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cd40 20 6d 65 6d 63 70 79 28 61 5a 69 70 2c 20 70 2d   memcpy(aZip, p-
2cd50 3e 62 6f 64 79 2e 61 2c 20 70 2d 3e 62 6f 64 79  >body.a, p->body
2cd60 2e 6e 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  .n);.      memcp
2cd70 79 28 26 61 5a 69 70 5b 70 2d 3e 62 6f 64 79 2e  y(&aZip[p->body.
2cd80 6e 5d 2c 20 70 2d 3e 63 64 73 2e 61 2c 20 70 2d  n], p->cds.a, p-
2cd90 3e 63 64 73 2e 6e 29 3b 0a 20 20 20 20 20 20 7a  >cds.n);.      z
2cda0 69 70 66 69 6c 65 53 65 72 69 61 6c 69 7a 65 45  ipfileSerializeE
2cdb0 4f 43 44 28 26 65 6f 63 64 2c 20 26 61 5a 69 70  OCD(&eocd, &aZip
2cdc0 5b 70 2d 3e 62 6f 64 79 2e 6e 20 2b 20 70 2d 3e  [p->body.n + p->
2cdd0 63 64 73 2e 6e 5d 29 3b 0a 20 20 20 20 20 20 73  cds.n]);.      s
2cde0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
2cdf0 6f 62 28 70 43 74 78 2c 20 61 5a 69 70 2c 20 28  ob(pCtx, aZip, (
2ce00 69 6e 74 29 6e 5a 69 70 2c 20 7a 69 70 66 69 6c  int)nZip, zipfil
2ce10 65 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eFree);.    }.  
2ce20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
2ce30 65 28 70 2d 3e 62 6f 64 79 2e 61 29 3b 0a 20 20  e(p->body.a);.  
2ce40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2ce50 63 64 73 2e 61 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  cds.a);.}.../*.*
2ce60 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 22  * Register the "
2ce70 7a 69 70 66 69 6c 65 22 20 76 69 72 74 75 61 6c  zipfile" virtual
2ce80 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
2ce90 63 20 69 6e 74 20 7a 69 70 66 69 6c 65 52 65 67  c int zipfileReg
2cea0 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64  ister(sqlite3 *d
2ceb0 62 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  b){.  static sql
2cec0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 7a 69 70 66  ite3_module zipf
2ced0 69 6c 65 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20  ileModule = {.  
2cee0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf00 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2cf10 7a 69 70 66 69 6c 65 43 6f 6e 6e 65 63 74 2c 20  zipfileConnect, 
2cf20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2cf30 72 65 61 74 65 20 2a 2f 0a 20 20 20 20 7a 69 70  reate */.    zip
2cf40 66 69 6c 65 43 6f 6e 6e 65 63 74 2c 20 20 20 20  fileConnect,    
2cf50 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
2cf60 65 63 74 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69  ect */.    zipfi
2cf70 6c 65 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20  leBestIndex,    
2cf80 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
2cf90 64 65 78 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69  dex */.    zipfi
2cfa0 6c 65 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  leDisconnect,   
2cfb0 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
2cfc0 6e 65 63 74 20 2a 2f 0a 20 20 20 20 7a 69 70 66  nect */.    zipf
2cfd0 69 6c 65 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20  ileDisconnect,  
2cfe0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72         /* xDestr
2cff0 6f 79 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c  oy */.    zipfil
2d000 65 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  eOpen,          
2d010 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
2d020 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
2d030 0a 20 20 20 20 7a 69 70 66 69 6c 65 43 6c 6f 73  .    zipfileClos
2d040 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2d050 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
2d060 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
2d070 20 20 7a 69 70 66 69 6c 65 46 69 6c 74 65 72 2c    zipfileFilter,
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d090 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
2d0a0 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
2d0b0 69 6e 74 73 20 2a 2f 0a 20 20 20 20 7a 69 70 66  ints */.    zipf
2d0c0 69 6c 65 4e 65 78 74 2c 20 20 20 20 20 20 20 20  ileNext,        
2d0d0 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
2d0e0 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
2d0f0 6f 72 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c  or */.    zipfil
2d100 65 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  eEof,           
2d110 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
2d120 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
2d130 73 63 61 6e 20 2a 2f 0a 20 20 20 20 7a 69 70 66  scan */.    zipf
2d140 69 6c 65 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  ileColumn,      
2d150 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
2d160 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
2d170 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d190 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
2d1a0 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 7a 69 70   data */.    zip
2d1b0 66 69 6c 65 55 70 64 61 74 65 2c 20 20 20 20 20  fileUpdate,     
2d1c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
2d1d0 74 65 20 2a 2f 0a 20 20 20 20 7a 69 70 66 69 6c  te */.    zipfil
2d1e0 65 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20  eBegin,         
2d1f0 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
2d200 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d220 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 20   /* xSync */.   
2d230 20 7a 69 70 66 69 6c 65 43 6f 6d 6d 69 74 2c 20   zipfileCommit, 
2d240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2d250 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 20 20 7a 69  Commit */.    zi
2d260 70 66 69 6c 65 52 6f 6c 6c 62 61 63 6b 2c 20 20  pfileRollback,  
2d270 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
2d280 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 7a 69 70  lback */.    zip
2d290 66 69 6c 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e  fileFindFunction
2d2a0 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64  ,       /* xFind
2d2b0 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 20 20 30 2c  Method */.    0,
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
2d2e0 61 6d 65 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 69  ame */.  };..  i
2d2f0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
2d300 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62  create_module(db
2d310 2c 20 22 7a 69 70 66 69 6c 65 22 20 20 2c 20 26  , "zipfile"  , &
2d320 7a 69 70 66 69 6c 65 4d 6f 64 75 6c 65 2c 20 30  zipfileModule, 0
2d330 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2d340 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71  ITE_OK ) rc = sq
2d350 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
2d360 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 7a 69 70  unction(db, "zip
2d370 66 69 6c 65 5f 63 64 73 22 2c 20 2d 31 29 3b 0a  file_cds", -1);.
2d380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d390 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2d3a0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2d3b0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 7a 69 70  unction(db, "zip
2d3c0 66 69 6c 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54  file", -1, SQLIT
2d3d0 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20  E_UTF8, 0, 0, . 
2d3e0 20 20 20 20 20 20 20 7a 69 70 66 69 6c 65 53 74         zipfileSt
2d3f0 65 70 2c 20 7a 69 70 66 69 6c 65 46 69 6e 61 6c  ep, zipfileFinal
2d400 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
2d410 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
2d420 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
2d430 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2d440 41 42 4c 45 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ABLE */.# define
2d450 20 7a 69 70 66 69 6c 65 52 65 67 69 73 74 65 72   zipfileRegister
2d460 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
2d470 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 57 49  ndif..#ifdef _WI
2d480 4e 33 32 0a 0a 23 65 6e 64 69 66 0a 69 6e 74 20  N32..#endif.int 
2d490 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f  sqlite3_zipfile_
2d4a0 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  init(.  sqlite3 
2d4b0 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  *db, .  char **p
2d4c0 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73  zErrMsg, .  cons
2d4d0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2d4e0 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
2d4f0 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
2d500 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
2d510 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 67    (void)pzErrMsg
2d520 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72  ;  /* Unused par
2d530 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 65 74 75  ameter */.  retu
2d540 72 6e 20 7a 69 70 66 69 6c 65 52 65 67 69 73 74  rn zipfileRegist
2d550 65 72 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  er(db);.}../****
2d560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d570 2a 2a 2a 2a 2a 20 45 6e 64 20 2e 2e 2f 65 78 74  ***** End ../ext
2d580 2f 6d 69 73 63 2f 7a 69 70 66 69 6c 65 2e 63 20  /misc/zipfile.c 
2d590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d5a0 2a 2a 2a 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****/./*********
2d5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d5c0 20 42 65 67 69 6e 20 2e 2e 2f 65 78 74 2f 6d 69   Begin ../ext/mi
2d5d0 73 63 2f 73 71 6c 61 72 2e 63 20 2a 2a 2a 2a 2a  sc/sqlar.c *****
2d5e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
2d5f0 2a 0a 2a 2a 20 32 30 31 37 2d 31 32 2d 31 37 0a  *.** 2017-12-17.
2d600 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72  **.** The author
2d610 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
2d620 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
2d630 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
2d640 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67 61  ace of.** a lega
2d650 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
2d660 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a 2a  s a blessing:.**
2d670 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64  .**    May you d
2d680 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65  o good and not e
2d690 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79  vil..**    May y
2d6a0 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e  ou find forgiven
2d6b0 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66  ess for yourself
2d6c0 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68   and forgive oth
2d6d0 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79  ers..**    May y
2d6e0 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c  ou share freely,
2d6f0 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f   never taking mo
2d700 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65  re than you give
2d710 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
2d720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d760 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74  ***.**.** Utilit
2d770 79 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 61  y functions sqla
2d780 72 5f 63 6f 6d 70 72 65 73 73 28 29 20 61 6e 64  r_compress() and
2d790 20 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73   sqlar_uncompres
2d7a0 73 28 29 2e 20 55 73 65 66 75 6c 0a 2a 2a 20 66  s(). Useful.** f
2d7b0 6f 72 20 77 6f 72 6b 69 6e 67 20 77 69 74 68 20  or working with 
2d7c0 73 71 6c 61 72 20 61 72 63 68 69 76 65 73 20 61  sqlar archives a
2d7d0 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 73  nd used by the s
2d7e0 68 65 6c 6c 20 74 6f 6f 6c 27 73 20 62 75 69 6c  hell tool's buil
2d7f0 74 2d 69 6e 0a 2a 2a 20 73 71 6c 61 72 20 73 75  t-in.** sqlar su
2d800 70 70 6f 72 74 2e 0a 2a 2f 0a 53 51 4c 49 54 45  pport..*/.SQLITE
2d810 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
2d820 0a 23 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e  .#include <zlib.
2d830 68 3e 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  h>../*.** Implem
2d840 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2d850 22 73 71 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28  "sqlar_compress(
2d860 58 29 22 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  X)" SQL function
2d870 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
2d880 79 70 65 20 6f 66 20 58 20 69 73 20 53 51 4c 49  ype of X is SQLI
2d890 54 45 5f 42 4c 4f 42 2c 20 61 6e 64 20 63 6f 6d  TE_BLOB, and com
2d8a0 70 72 65 73 73 69 6e 67 20 74 68 61 74 20 62 6c  pressing that bl
2d8b0 6f 62 20 75 73 69 6e 67 0a 2a 2a 20 7a 6c 69 62  ob using.** zlib
2d8c0 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
2d8d0 6e 20 63 6f 6d 70 72 65 73 73 28 29 20 79 69 65  n compress() yie
2d8e0 6c 64 73 20 61 20 73 6d 61 6c 6c 65 72 20 62 6c  lds a smaller bl
2d8f0 6f 62 2c 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  ob, return the.*
2d900 2a 20 63 6f 6d 70 72 65 73 73 65 64 20 62 6c 6f  * compressed blo
2d910 62 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  b. Otherwise, re
2d920 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 58  turn a copy of X
2d930 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 61 72 20 75 73  ..**.** SQLar us
2d940 65 73 20 74 68 65 20 22 7a 6c 69 62 20 66 6f 72  es the "zlib for
2d950 6d 61 74 22 20 66 6f 72 20 63 6f 6d 70 72 65 73  mat" for compres
2d960 73 65 64 20 63 6f 6e 74 65 6e 74 2e 20 20 54 68  sed content.  Th
2d970 65 20 7a 6c 69 62 20 66 6f 72 6d 61 74 0a 2a 2a  e zlib format.**
2d980 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 77 6f 2d   contains a two-
2d990 62 79 74 65 20 69 64 65 6e 74 69 66 69 63 61 74  byte identificat
2d9a0 69 6f 6e 20 68 65 61 64 65 72 20 61 6e 64 20 61  ion header and a
2d9b0 20 66 6f 75 72 2d 62 79 74 65 20 63 68 65 63 6b   four-byte check
2d9c0 73 75 6d 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  sum at.** the en
2d9d0 64 2e 20 20 54 68 69 73 20 69 73 20 64 69 66 66  d.  This is diff
2d9e0 65 72 65 6e 74 20 66 72 6f 6d 20 5a 49 50 20 77  erent from ZIP w
2d9f0 68 69 63 68 20 75 73 65 73 20 74 68 65 20 72 61  hich uses the ra
2da00 77 20 64 65 66 6c 61 74 65 20 66 6f 72 6d 61 74  w deflate format
2da10 2e 0a 2a 2a 0a 2a 2a 20 46 75 74 75 72 65 20 65  ..**.** Future e
2da20 6e 68 61 6e 63 65 6d 65 6e 74 73 20 74 6f 20 53  nhancements to S
2da30 51 4c 61 72 20 6d 69 67 68 74 20 61 64 64 20 73  QLar might add s
2da40 75 70 70 6f 72 74 20 66 6f 72 20 6e 65 77 20 63  upport for new c
2da50 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 6d 61  ompression forma
2da60 74 73 2e 0a 2a 2a 20 49 66 20 73 6f 2c 20 74 68  ts..** If so, th
2da70 6f 73 65 20 6e 65 77 20 66 6f 72 6d 61 74 73 20  ose new formats 
2da80 77 69 6c 6c 20 62 65 20 69 64 65 6e 74 69 66 69  will be identifi
2da90 65 64 20 62 79 20 61 6c 74 65 72 6e 61 74 69 76  ed by alternativ
2daa0 65 20 68 65 61 64 65 72 73 20 69 6e 20 74 68 65  e headers in the
2dab0 0a 2a 2a 20 63 6f 6d 70 72 65 73 73 65 64 20 64  .** compressed d
2dac0 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
2dad0 6f 69 64 20 73 71 6c 61 72 43 6f 6d 70 72 65 73  oid sqlarCompres
2dae0 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  sFunc(.  sqlite3
2daf0 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
2db00 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
2db10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2db20 2a 61 72 67 76 0a 29 7b 0a 20 20 61 73 73 65 72  *argv.){.  asser
2db30 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
2db40 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
2db50 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
2db60 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 29 7b 0a  =SQLITE_BLOB ){.
2db70 20 20 20 20 63 6f 6e 73 74 20 42 79 74 65 66 20      const Bytef 
2db80 2a 70 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  *pData = sqlite3
2db90 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
2dba0 5b 30 5d 29 3b 0a 20 20 20 20 75 4c 6f 6e 67 20  [0]);.    uLong 
2dbb0 6e 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f  nData = sqlite3_
2dbc0 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
2dbd0 5b 30 5d 29 3b 0a 20 20 20 20 75 4c 6f 6e 67 66  [0]);.    uLongf
2dbe0 20 6e 4f 75 74 20 3d 20 63 6f 6d 70 72 65 73 73   nOut = compress
2dbf0 42 6f 75 6e 64 28 6e 44 61 74 61 29 3b 0a 20 20  Bound(nData);.  
2dc00 20 20 42 79 74 65 66 20 2a 70 4f 75 74 3b 0a 0a    Bytef *pOut;..
2dc10 20 20 20 20 70 4f 75 74 20 3d 20 28 42 79 74 65      pOut = (Byte
2dc20 66 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f*)sqlite3_mallo
2dc30 63 28 6e 4f 75 74 29 3b 0a 20 20 20 20 69 66 28  c(nOut);.    if(
2dc40 20 70 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pOut==0 ){.    
2dc50 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2dc60 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
2dc70 74 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65 74  text);.      ret
2dc80 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
2dc90 20 20 20 20 20 20 69 66 28 20 5a 5f 4f 4b 21 3d        if( Z_OK!=
2dca0 63 6f 6d 70 72 65 73 73 28 70 4f 75 74 2c 20 26  compress(pOut, &
2dcb0 6e 4f 75 74 2c 20 70 44 61 74 61 2c 20 6e 44 61  nOut, pData, nDa
2dcc0 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ta) ){.        s
2dcd0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2dce0 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65 72  ror(context, "er
2dcf0 72 6f 72 20 69 6e 20 63 6f 6d 70 72 65 73 73 28  ror in compress(
2dd00 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d  )", -1);.      }
2dd10 65 6c 73 65 20 69 66 28 20 6e 4f 75 74 3c 6e 44  else if( nOut<nD
2dd20 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ata ){.        s
2dd30 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
2dd40 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 4f 75 74  ob(context, pOut
2dd50 2c 20 6e 4f 75 74 2c 20 53 51 4c 49 54 45 5f 54  , nOut, SQLITE_T
2dd60 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
2dd70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dd80 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
2dd90 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
2dda0 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[0]);.      }.
2ddb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ddc0 65 65 28 70 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(pOut);.    }.
2ddd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2dde0 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
2ddf0 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
2de00 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0]);.  }.}../*.*
2de10 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2de20 20 6f 66 20 74 68 65 20 22 73 71 6c 61 72 5f 75   of the "sqlar_u
2de30 6e 63 6f 6d 70 72 65 73 73 28 58 2c 53 5a 29 22  ncompress(X,SZ)"
2de40 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
2de50 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 53 5a  .** Parameter SZ
2de60 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
2de70 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 49  as an integer. I
2de80 66 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  f it is less tha
2de90 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  n or.** equal to
2dea0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
2deb0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2dec0 73 20 61 20 63 6f 70 79 20 6f 66 20 58 2e 20 4f  s a copy of X. O
2ded0 72 2c 20 69 66 0a 2a 2a 20 53 5a 20 69 73 20 65  r, if.** SZ is e
2dee0 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
2def0 20 6f 66 20 58 20 77 68 65 6e 20 69 6e 74 65 72   of X when inter
2df00 70 72 65 74 65 64 20 61 73 20 61 20 62 6c 6f 62  preted as a blob
2df10 2c 20 61 6c 73 6f 0a 2a 2a 20 72 65 74 75 72 6e  , also.** return
2df20 20 61 20 63 6f 70 79 20 6f 66 20 58 2e 20 4f 74   a copy of X. Ot
2df30 68 65 72 77 69 73 65 2c 20 64 65 63 6f 6d 70 72  herwise, decompr
2df40 65 73 73 20 62 6c 6f 62 20 58 20 75 73 69 6e 67  ess blob X using
2df50 20 7a 6c 69 62 0a 2a 2a 20 75 74 69 6c 69 74 79   zlib.** utility
2df60 20 66 75 6e 63 74 69 6f 6e 20 75 6e 63 6f 6d 70   function uncomp
2df70 72 65 73 73 28 29 20 61 6e 64 20 72 65 74 75 72  ress() and retur
2df80 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 28 61  n the results (a
2df90 6e 6f 74 68 65 72 0a 2a 2a 20 62 6c 6f 62 29 2e  nother.** blob).
2dfa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2dfb0 73 71 6c 61 72 55 6e 63 6f 6d 70 72 65 73 73 46  sqlarUncompressF
2dfc0 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2dfd0 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2dfe0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
2dff0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2e000 72 67 76 0a 29 7b 0a 20 20 75 4c 6f 6e 67 20 6e  rgv.){.  uLong n
2e010 44 61 74 61 3b 0a 20 20 75 4c 6f 6e 67 66 20 73  Data;.  uLongf s
2e020 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  z;..  assert( ar
2e030 67 63 3d 3d 32 20 29 3b 0a 20 20 73 7a 20 3d 20  gc==2 );.  sz = 
2e040 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2e050 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20 20 69  t(argv[1]);..  i
2e060 66 28 20 73 7a 3c 3d 30 20 7c 7c 20 73 7a 3d 3d  f( sz<=0 || sz==
2e070 28 6e 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  (nData = sqlite3
2e080 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
2e090 76 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20 73 71  v[0])) ){.    sq
2e0a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
2e0b0 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
2e0c0 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [0]);.  }else{. 
2e0d0 20 20 20 63 6f 6e 73 74 20 42 79 74 65 66 20 2a     const Bytef *
2e0e0 70 44 61 74 61 3d 20 73 71 6c 69 74 65 33 5f 76  pData= sqlite3_v
2e0f0 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
2e100 5d 29 3b 0a 20 20 20 20 42 79 74 65 66 20 2a 70  ]);.    Bytef *p
2e110 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Out = sqlite3_ma
2e120 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 69 66  lloc(sz);.    if
2e130 28 20 5a 5f 4f 4b 21 3d 75 6e 63 6f 6d 70 72 65  ( Z_OK!=uncompre
2e140 73 73 28 70 4f 75 74 2c 20 26 73 7a 2c 20 70 44  ss(pOut, &sz, pD
2e150 61 74 61 2c 20 6e 44 61 74 61 29 20 29 7b 0a 20  ata, nData) ){. 
2e160 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2e170 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
2e180 74 2c 20 22 65 72 72 6f 72 20 69 6e 20 75 6e 63  t, "error in unc
2e190 6f 6d 70 72 65 73 73 28 29 22 2c 20 2d 31 29 3b  ompress()", -1);
2e1a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e1b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2e1c0 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70  _blob(context, p
2e1d0 4f 75 74 2c 20 73 7a 2c 20 53 51 4c 49 54 45 5f  Out, sz, SQLITE_
2e1e0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
2e1f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2e200 65 65 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  ee(pOut);.  }.}.
2e210 0a 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ..#ifdef _WIN32.
2e220 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69  .#endif.int sqli
2e230 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 0a  te3_sqlar_init(.
2e240 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
2e250 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
2e260 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
2e270 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2e280 20 2a 70 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20   *pApi.){.  int 
2e290 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e2a0 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
2e2b0 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
2e2c0 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 67    (void)pzErrMsg
2e2d0 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 72  ;  /* Unused par
2e2e0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 63 20 3d  ameter */.  rc =
2e2f0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
2e300 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 71  function(db, "sq
2e310 6c 61 72 5f 63 6f 6d 70 72 65 73 73 22 2c 20 31  lar_compress", 1
2e320 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
2e330 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e350 20 73 71 6c 61 72 43 6f 6d 70 72 65 73 73 46 75   sqlarCompressFu
2e360 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  nc, 0, 0);.  if(
2e370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e380 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2e390 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2e3a0 6f 6e 28 64 62 2c 20 22 73 71 6c 61 72 5f 75 6e  on(db, "sqlar_un
2e3b0 63 6f 6d 70 72 65 73 73 22 2c 20 32 2c 20 53 51  compress", 2, SQ
2e3c0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2e3f0 71 6c 61 72 55 6e 63 6f 6d 70 72 65 73 73 46 75  qlarUncompressFu
2e400 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  nc, 0, 0);.  }. 
2e410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e430 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 2e 2e  ********* End ..
2e440 2f 65 78 74 2f 6d 69 73 63 2f 73 71 6c 61 72 2e  /ext/misc/sqlar.
2e450 63 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c **************
2e460 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 0a 2f  ******/.#endif./
2e470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e480 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
2e490 2e 2e 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71  ../ext/expert/sq
2e4a0 6c 69 74 65 33 65 78 70 65 72 74 2e 68 20 2a 2a  lite3expert.h **
2e4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4c0 2f 0a 2f 2a 0a 2a 2a 20 32 30 31 37 20 41 70 72  /./*.** 2017 Apr
2e4d0 69 6c 20 30 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20  il 07.**.** The 
2e4e0 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
2e4f0 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
2e500 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
2e510 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
2e520 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
2e530 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
2e540 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
2e550 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
2e560 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
2e570 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
2e580 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
2e590 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
2e5a0 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
2e5b0 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
2e5c0 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
2e5d0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
2e5e0 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
2e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e630 2a 2a 2a 2a 0a 2a 2f 0a 0a 0a 0a 74 79 70 65 64  ****.*/....typed
2e640 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  ef struct sqlite
2e650 33 65 78 70 65 72 74 20 73 71 6c 69 74 65 33 65  3expert sqlite3e
2e660 78 70 65 72 74 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72  xpert;../*.** Cr
2e670 65 61 74 65 20 61 20 6e 65 77 20 73 71 6c 69 74  eate a new sqlit
2e680 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e  e3expert object.
2e690 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2e6a0 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20  sful, a pointer 
2e6b0 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
2e6c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  t is returned an
2e6d0 64 20 28 2a 70 7a 45 72 72 29 20 73 65 74 0a 2a  d (*pzErr) set.*
2e6e0 2a 20 74 6f 20 4e 55 4c 4c 2e 20 4f 72 2c 20 69  * to NULL. Or, i
2e6f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e700 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
2e710 6e 65 64 20 61 6e 64 20 28 2a 70 7a 45 72 72 29  ned and (*pzErr)
2e720 20 73 65 74 20 74 6f 0a 2a 2a 20 61 6e 20 45 6e   set to.** an En
2e730 67 6c 69 73 68 2d 6c 61 6e 67 75 61 67 65 20 65  glish-language e
2e740 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 6e  rror message. In
2e750 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
2e760 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2e770 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61  ity.** of the ca
2e780 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
2e790 6c 79 20 66 72 65 65 20 74 68 65 20 65 72 72 6f  ly free the erro
2e7a0 72 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72  r message buffer
2e7b0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
2e7c0 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  3_free()..*/.sql
2e7d0 69 74 65 33 65 78 70 65 72 74 20 2a 73 71 6c 69  ite3expert *sqli
2e7e0 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28 73  te3_expert_new(s
2e7f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72  qlite3 *db, char
2e800 20 2a 2a 70 7a 45 72 72 29 3b 0a 0a 2f 2a 0a 2a   **pzErr);../*.*
2e810 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
2e820 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a  qlite3expert obj
2e830 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 45 58 50 45 52  ect..**.** EXPER
2e840 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 3a  T_CONFIG_SAMPLE:
2e850 0a 2a 2a 20 20 20 42 79 20 64 65 66 61 75 6c 74  .**   By default
2e860 2c 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  , sqlite3_expert
2e870 5f 61 6e 61 6c 79 7a 65 28 29 20 67 65 6e 65 72  _analyze() gener
2e880 61 74 65 73 20 73 71 6c 69 74 65 5f 73 74 61 74  ates sqlite_stat
2e890 31 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 20 20  1 data for.**   
2e8a0 65 61 63 68 20 63 61 6e 64 69 64 61 74 65 20 69  each candidate i
2e8b0 6e 64 65 78 2e 20 54 68 69 73 20 69 6e 76 6f 6c  ndex. This invol
2e8c0 76 65 73 20 73 63 61 6e 6e 69 6e 67 20 61 6e 64  ves scanning and
2e8d0 20 73 6f 72 74 69 6e 67 20 74 68 65 20 65 6e 74   sorting the ent
2e8e0 69 72 65 0a 2a 2a 20 20 20 63 6f 6e 74 65 6e 74  ire.**   content
2e8f0 73 20 6f 66 20 65 61 63 68 20 75 73 65 72 20 64  s of each user d
2e900 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 6e  atabase table on
2e910 63 65 20 66 6f 72 20 65 61 63 68 20 63 61 6e 64  ce for each cand
2e920 69 64 61 74 65 20 69 6e 64 65 78 0a 2a 2a 20 20  idate index.**  
2e930 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2e940 20 74 68 65 20 74 61 62 6c 65 2e 20 46 6f 72 20   the table. For 
2e950 6c 61 72 67 65 20 64 61 74 61 62 61 73 65 73 2c  large databases,
2e960 20 74 68 69 73 20 63 61 6e 20 62 65 20 0a 2a 2a   this can be .**
2e970 20 20 20 70 72 6f 68 69 62 69 74 69 76 65 6c 79     prohibitively
2e980 20 73 6c 6f 77 2e 20 54 68 69 73 20 6f 70 74 69   slow. This opti
2e990 6f 6e 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 71  on allows the sq
2e9a0 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65  lite3expert obje
2e9b0 63 74 20 74 6f 0a 2a 2a 20 20 20 62 65 20 63 6f  ct to.**   be co
2e9c0 6e 66 69 67 75 72 65 64 20 73 6f 20 74 68 61 74  nfigured so that
2e9d0 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61   sqlite_stat1 da
2e9e0 74 61 20 69 73 20 69 6e 73 74 65 61 64 20 67 65  ta is instead ge
2e9f0 6e 65 72 61 74 65 64 20 62 61 73 65 64 20 6f 6e  nerated based on
2ea00 20 61 0a 2a 2a 20 20 20 73 75 62 73 65 74 20 6f   a.**   subset o
2ea10 66 20 65 61 63 68 20 74 61 62 6c 65 2c 20 6f 72  f each table, or
2ea20 20 73 6f 20 74 68 61 74 20 6e 6f 20 73 71 6c 69   so that no sqli
2ea30 74 65 5f 73 74 61 74 31 20 64 61 74 61 20 69 73  te_stat1 data is
2ea40 20 75 73 65 64 20 61 74 20 61 6c 6c 2e 0a 2a 2a   used at all..**
2ea50 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c 65 20 69  .**   A single i
2ea60 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20  nteger argument 
2ea70 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
2ea80 73 20 6f 70 74 69 6f 6e 2e 20 49 66 20 74 68 65  s option. If the
2ea90 20 76 61 6c 75 65 20 69 73 20 6c 65 73 73 0a 2a   value is less.*
2eaa0 2a 20 20 20 74 68 61 6e 20 6f 72 20 65 71 75 61  *   than or equa
2eab0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
2eac0 6e 6f 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20  no sqlite_stat1 
2ead0 64 61 74 61 20 69 73 20 67 65 6e 65 72 61 74 65  data is generate
2eae0 64 20 6f 72 20 75 73 65 64 20 62 79 0a 2a 2a 20  d or used by.** 
2eaf0 20 20 74 68 65 20 61 6e 61 6c 79 73 69 73 20 2d    the analysis -
2eb00 20 69 6e 64 65 78 65 73 20 61 72 65 20 72 65 63   indexes are rec
2eb10 6f 6d 6d 65 6e 64 65 64 20 62 61 73 65 64 20 6f  ommended based o
2eb20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
2eb30 63 68 65 6d 61 20 6f 6e 6c 79 2e 0a 2a 2a 20 20  chema only..**  
2eb40 20 4f 72 2c 20 69 66 20 74 68 65 20 76 61 6c 75   Or, if the valu
2eb50 65 20 69 73 20 31 30 30 20 6f 72 20 67 72 65 61  e is 100 or grea
2eb60 74 65 72 2c 20 63 6f 6d 70 6c 65 74 65 20 73 71  ter, complete sq
2eb70 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 20  lite_stat1 data 
2eb80 69 73 0a 2a 2a 20 20 20 67 65 6e 65 72 61 74 65  is.**   generate
2eb90 64 20 66 6f 72 20 65 61 63 68 20 63 61 6e 64 69  d for each candi
2eba0 64 61 74 65 20 69 6e 64 65 78 20 28 74 68 69 73  date index (this
2ebb0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 29   is the default)
2ebc0 2e 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68  . Finally, if th
2ebd0 65 0a 2a 2a 20 20 20 76 61 6c 75 65 20 66 61 6c  e.**   value fal
2ebe0 6c 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  ls between 0 and
2ebf0 20 31 30 30 2c 20 74 68 65 6e 20 69 74 20 72 65   100, then it re
2ec00 70 72 65 73 65 6e 74 73 20 74 68 65 20 70 65 72  presents the per
2ec10 63 65 6e 74 61 67 65 20 6f 66 20 75 73 65 72 0a  centage of user.
2ec20 2a 2a 20 20 20 74 61 62 6c 65 20 72 6f 77 73 20  **   table rows 
2ec30 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
2ec40 6f 6e 73 69 64 65 72 65 64 20 77 68 65 6e 20 67  onsidered when g
2ec50 65 6e 65 72 61 74 69 6e 67 20 73 71 6c 69 74 65  enerating sqlite
2ec60 5f 73 74 61 74 31 20 64 61 74 61 2e 0a 2a 2a 0a  _stat1 data..**.
2ec70 2a 2a 20 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a  **   Examples:.*
2ec80 2a 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20 6e  *.**     // Do n
2ec90 6f 74 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20  ot generate any 
2eca0 73 71 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74  sqlite_stat1 dat
2ecb0 61 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  a.**     sqlite3
2ecc0 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 70  _expert_config(p
2ecd0 45 78 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43  Expert, EXPERT_C
2ece0 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c 20 30 29  ONFIG_SAMPLE, 0)
2ecf0 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2f 2f 20 47  ;.**.**     // G
2ed00 65 6e 65 72 61 74 65 20 73 71 6c 69 74 65 5f 73  enerate sqlite_s
2ed10 74 61 74 31 20 64 61 74 61 20 62 61 73 65 64 20  tat1 data based 
2ed20 6f 6e 20 31 30 25 20 6f 66 20 74 68 65 20 72 6f  on 10% of the ro
2ed30 77 73 20 69 6e 20 65 61 63 68 20 74 61 62 6c 65  ws in each table
2ed40 2e 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ..**     sqlite3
2ed50 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 70  _expert_config(p
2ed60 45 78 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43  Expert, EXPERT_C
2ed70 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c 20 31 30  ONFIG_SAMPLE, 10
2ed80 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2ed90 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28  3_expert_config(
2eda0 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
2edb0 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 3b 0a  , int op, ...);.
2edc0 0a 23 64 65 66 69 6e 65 20 45 58 50 45 52 54 5f  .#define EXPERT_
2edd0 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 20 31 20  CONFIG_SAMPLE 1 
2ede0 20 20 20 2f 2a 20 69 6e 74 20 2a 2f 0a 0a 2f 2a     /* int */../*
2edf0 0a 2a 2a 20 53 70 65 63 69 66 79 20 7a 65 72 6f  .** Specify zero
2ee00 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20 73 74 61   or more SQL sta
2ee10 74 65 6d 65 6e 74 73 20 74 6f 20 62 65 20 69 6e  tements to be in
2ee20 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 61 6e  cluded in the an
2ee30 61 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  alysis..**.** Bu
2ee40 66 66 65 72 20 7a 53 71 6c 20 6d 75 73 74 20 63  ffer zSql must c
2ee50 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d  ontain zero or m
2ee60 6f 72 65 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  ore complete SQL
2ee70 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 54 68 69   statements. Thi
2ee80 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61  s.** function pa
2ee90 72 73 65 73 20 61 6c 6c 20 73 74 61 74 65 6d 65  rses all stateme
2eea0 6e 74 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  nts contained in
2eeb0 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
2eec0 61 64 64 73 20 74 68 65 6d 0a 2a 2a 20 74 6f 20  adds them.** to 
2eed0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 69 73  the internal lis
2eee0 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20  t of statements 
2eef0 74 6f 20 61 6e 61 6c 79 7a 65 2e 20 49 66 20 73  to analyze. If s
2ef00 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2ef10 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
2ef20 6e 65 64 20 61 6e 64 20 28 2a 70 7a 45 72 72 29  ned and (*pzErr)
2ef30 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 4f 72   set to NULL. Or
2ef40 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
2ef50 63 75 72 73 20 2d 20 66 6f 72 20 65 78 61 6d 70  curs - for examp
2ef60 6c 65 0a 2a 2a 20 64 75 65 20 74 6f 20 61 20 65  le.** due to a e
2ef70 72 72 6f 72 20 69 6e 20 74 68 65 20 53 51 4c 20  rror in the SQL 
2ef80 2d 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  - an SQLite erro
2ef90 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2efa0 65 64 20 61 6e 64 20 28 2a 70 7a 45 72 72 29 0a  ed and (*pzErr).
2efb0 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  ** may be set to
2efc0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 45 6e 67   point to an Eng
2efd0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
2efe0 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 6e 20  ror message. In 
2eff0 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65  this case.** the
2f000 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
2f010 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74  nsible for event
2f020 75 61 6c 6c 79 20 66 72 65 65 69 6e 67 20 74 68  ually freeing th
2f030 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2f040 62 75 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67 20  buffer.** using 
2f050 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
2f060 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2f070 72 20 64 6f 65 73 20 6f 63 63 75 72 20 77 68 69  r does occur whi
2f080 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 6e  le processing on
2f090 65 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  e of the stateme
2f0a0 6e 74 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62 75  nts in the.** bu
2f0b0 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
2f0c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2f0d0 6e 74 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  nt, none of the 
2f0e0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
2f0f0 65 0a 2a 2a 20 62 75 66 66 65 72 20 61 72 65 20  e.** buffer are 
2f100 61 64 64 65 64 20 74 6f 20 74 68 65 20 61 6e 61  added to the ana
2f110 6c 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lysis..**.** Thi
2f120 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
2f130 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
2f140 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
2f150 61 6e 61 6c 79 7a 65 28 29 2e 20 49 66 20 61 20  analyze(). If a 
2f160 63 61 6c 6c 0a 2a 2a 20 74 6f 20 74 68 69 73 20  call.** to this 
2f170 66 75 6e 63 74 69 6f 6e 20 69 73 20 6d 61 64 65  function is made
2f180 20 6f 6e 20 61 6e 20 73 71 6c 69 74 65 33 65 78   on an sqlite3ex
2f190 70 65 72 74 20 6f 62 6a 65 63 74 20 74 68 61 74  pert object that
2f1a0 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
2f1b0 62 65 65 6e 20 70 61 73 73 65 64 20 74 6f 20 73  been passed to s
2f1c0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e  qlite3_expert_an
2f1d0 61 6c 79 7a 65 28 29 20 53 51 4c 49 54 45 5f 4d  alyze() SQLITE_M
2f1e0 49 53 55 53 45 20 69 73 20 72 65 74 75 72 6e 65  ISUSE is returne
2f1f0 64 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  d.** immediately
2f200 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
2f210 74 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ts are added to 
2f220 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 0a 2a 2f  the analysis..*/
2f230 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 70  .int sqlite3_exp
2f240 65 72 74 5f 73 71 6c 28 0a 20 20 73 71 6c 69 74  ert_sql(.  sqlit
2f250 65 33 65 78 70 65 72 74 20 2a 70 2c 20 20 20 20  e3expert *p,    
2f260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
2f270 6f 6d 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  om a successful 
2f280 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e  sqlite3_expert_n
2f290 65 77 28 29 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ew() */.  const 
2f2a0 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
2f2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
2f2c0 20 73 74 61 74 65 6d 65 6e 74 28 73 29 20 74 6f   statement(s) to
2f2d0 20 61 64 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a   add */.  char *
2f2e0 2a 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20  *pzErr          
2f2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2f300 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
2f310 28 69 66 20 61 6e 79 29 20 2a 2f 0a 29 3b 0a 0a  (if any) */.);..
2f320 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f330 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
2f340 66 74 65 72 20 74 68 65 20 73 71 6c 69 74 65 33  fter the sqlite3
2f350 65 78 70 65 72 74 20 6f 62 6a 65 63 74 20 68 61  expert object ha
2f360 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  s been configure
2f370 64 0a 2a 2a 20 77 69 74 68 20 61 6c 6c 20 53 51  d.** with all SQ
2f380 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  L statements usi
2f390 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72  ng sqlite3_exper
2f3a0 74 5f 73 71 6c 28 29 20 74 6f 20 61 63 74 75 61  t_sql() to actua
2f3b0 6c 6c 79 20 70 65 72 66 6f 72 6d 0a 2a 2a 20 74  lly perform.** t
2f3c0 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 4f 6e 63  he analysis. Onc
2f3d0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2f3e0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  has been called,
2f3f0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
2f400 62 6c 65 20 74 6f 0a 2a 2a 20 61 64 64 20 66 75  ble to.** add fu
2f410 72 74 68 65 72 20 53 51 4c 20 73 74 61 74 65 6d  rther SQL statem
2f420 65 6e 74 73 20 74 6f 20 74 68 65 20 61 6e 61 6c  ents to the anal
2f430 79 73 69 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ysis..**.** If s
2f440 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2f450 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f460 20 61 6e 64 20 28 2a 70 7a 45 72 72 29 20 69 73   and (*pzErr) is
2f470 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 4f 72   set to NULL. Or
2f480 2c 20 69 66 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  , if.** an error
2f490 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
2f4a0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2f4b0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 28 2a   returned and (*
2f4c0 70 7a 45 72 72 29 20 73 65 74 20 74 6f 20 0a 2a  pzErr) set to .*
2f4d0 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  * point to a buf
2f4e0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
2f4f0 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
2f500 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
2f510 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2f520 65 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  e it is the resp
2f530 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2f540 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
2f550 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65 20  tually free the 
2f560 62 75 66 66 65 72 0a 2a 2a 20 75 73 69 6e 67 20  buffer.** using 
2f570 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
2f580 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2f590 72 20 64 6f 65 73 20 6f 63 63 75 72 20 77 69 74  r does occur wit
2f5a0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
2f5b0 6e 2c 20 74 68 65 20 73 71 6c 69 74 65 33 65 78  n, the sqlite3ex
2f5c0 70 65 72 74 20 6f 62 6a 65 63 74 0a 2a 2a 20 69  pert object.** i
2f5d0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 66  s no longer usef
2f5e0 75 6c 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f  ul for any purpo
2f5f0 73 65 2e 20 41 74 20 74 68 61 74 20 70 6f 69 6e  se. At that poin
2f600 74 20 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  t it is no longe
2f610 72 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  r.** possible to
2f620 20 61 64 64 20 66 75 72 74 68 65 72 20 53 51 4c   add further SQL
2f630 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74   statements to t
2f640 68 65 20 6f 62 6a 65 63 74 20 6f 72 20 74 6f 20  he object or to 
2f650 72 65 2d 61 74 74 65 6d 70 74 0a 2a 2a 20 74 68  re-attempt.** th
2f660 65 20 61 6e 61 6c 79 73 69 73 2e 20 54 68 65 20  e analysis. The 
2f670 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62  sqlite3expert ob
2f680 6a 65 63 74 20 6d 75 73 74 20 73 74 69 6c 6c 20  ject must still 
2f690 62 65 20 66 72 65 65 64 20 75 73 69 6e 67 20 61  be freed using a
2f6a0 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33   call.** sqlite3
2f6b0 5f 65 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28  _expert_destroy(
2f6c0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
2f6d0 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65  3_expert_analyze
2f6e0 28 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a  (sqlite3expert *
2f6f0 70 2c 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 29  p, char **pzErr)
2f700 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ;../*.** Return 
2f710 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
2f720 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73 20 6c   of statements l
2f730 6f 61 64 65 64 20 75 73 69 6e 67 20 73 71 6c 69  oaded using sqli
2f740 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c 28 29  te3_expert_sql()
2f750 2e 0a 2a 2a 20 54 68 65 20 74 6f 74 61 6c 20 6e  ..** The total n
2f760 75 6d 62 65 72 20 6f 66 20 53 51 4c 20 73 74 61  umber of SQL sta
2f770 74 65 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 64  tements may be d
2f780 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
2f790 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a  e total number.*
2f7a0 2a 20 74 6f 20 63 61 6c 6c 73 20 74 6f 20 73 71  * to calls to sq
2f7b0 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c  lite3_expert_sql
2f7c0 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
2f7d0 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28  e3_expert_count(
2f7e0 73 71 6c 69 74 65 33 65 78 70 65 72 74 2a 29 3b  sqlite3expert*);
2f7f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2f800 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68   component of th
2f810 65 20 72 65 70 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20  e report..**.** 
2f820 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f830 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 73 71   called after sq
2f840 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e 61  lite3_expert_ana
2f850 6c 79 7a 65 28 29 20 74 6f 20 65 78 74 72 61 63  lyze() to extrac
2f860 74 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  t the.** results
2f870 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69 73   of the analysis
2f880 2e 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  . Each call to t
2f890 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2f8a0 75 72 6e 73 20 65 69 74 68 65 72 20 61 0a 2a 2a  urns either a.**
2f8b0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72   NULL pointer or
2f8c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2f8d0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2f8e0 67 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  g a nul-terminat
2f8f0 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68  ed string..** Th
2f900 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2f910 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
2f920 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  ment must be one
2f930 20 6f 66 20 74 68 65 20 45 58 50 45 52 54 5f 52   of the EXPERT_R
2f940 45 50 4f 52 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  EPORT_*.** #defi
2f950 6e 65 20 63 6f 6e 73 74 61 6e 74 73 20 64 65 66  ne constants def
2f960 69 6e 65 64 20 62 65 6c 6f 77 2e 0a 2a 2a 0a 2a  ined below..**.*
2f970 2a 20 46 6f 72 20 73 6f 6d 65 20 45 58 50 45 52  * For some EXPER
2f980 54 5f 52 45 50 4f 52 54 5f 2a 20 70 61 72 61 6d  T_REPORT_* param
2f990 65 74 65 72 73 2c 20 74 68 65 20 62 75 66 66 65  eters, the buffe
2f9a0 72 20 72 65 74 75 72 6e 65 64 20 63 6f 6e 74 61  r returned conta
2f9b0 69 6e 73 20 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ins .** informat
2f9c0 69 6f 6e 20 72 65 6c 61 74 69 6e 67 20 74 6f 20  ion relating to 
2f9d0 61 20 73 70 65 63 69 66 69 63 20 53 51 4c 20 73  a specific SQL s
2f9e0 74 61 74 65 6d 65 6e 74 2e 20 49 6e 20 74 68 65  tatement. In the
2f9f0 73 65 20 63 61 73 65 73 20 74 68 61 74 0a 2a 2a  se cases that.**
2fa00 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
2fa10 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2fa20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
2fa30 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2fa40 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 53 51 4c 20  rgument..** SQL 
2fa50 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 6e  statements are n
2fa60 75 6d 62 65 72 65 64 20 66 72 6f 6d 20 30 20 69  umbered from 0 i
2fa70 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
2fa80 68 69 63 68 20 74 68 65 79 20 61 72 65 20 70 61  hich they are pa
2fa90 72 73 65 64 2e 0a 2a 2a 20 49 66 20 61 6e 20 6f  rsed..** If an o
2faa0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 76 61 6c 75  ut-of-range valu
2fab0 65 20 28 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  e (less than zer
2fac0 6f 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 6f 72  o or equal to or
2fad0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2fae0 65 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72  e.** value retur
2faf0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 65  ned by sqlite3_e
2fb00 78 70 65 72 74 5f 63 6f 75 6e 74 28 29 29 20 69  xpert_count()) i
2fb10 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
2fb20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
2fb30 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 73 75  ** along with su
2fb40 63 68 20 61 6e 20 45 58 50 45 52 54 5f 52 45 50  ch an EXPERT_REP
2fb50 4f 52 54 5f 2a 20 70 61 72 61 6d 65 74 65 72 2c  ORT_* parameter,
2fb60 20 4e 55 4c 4c 20 69 73 20 61 6c 77 61 79 73 20   NULL is always 
2fb70 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
2fb80 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53 51  EXPERT_REPORT_SQ
2fb90 4c 3a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 74  L:.**   Return t
2fba0 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 20 73  he text of SQL s
2fbb0 74 61 74 65 6d 65 6e 74 20 69 53 74 6d 74 2e 0a  tatement iStmt..
2fbc0 2a 2a 0a 2a 2a 20 45 58 50 45 52 54 5f 52 45 50  **.** EXPERT_REP
2fbd0 4f 52 54 5f 49 4e 44 45 58 45 53 3a 0a 2a 2a 20  ORT_INDEXES:.** 
2fbe0 20 20 52 65 74 75 72 6e 20 61 20 62 75 66 66 65    Return a buffe
2fbf0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
2fc00 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
2fc10 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 61 6c 6c  atements for all
2fc20 20 72 65 63 6f 6d 6d 65 6e 64 65 64 0a 2a 2a 20   recommended.** 
2fc30 20 20 69 6e 64 65 78 65 73 20 66 6f 72 20 73 74    indexes for st
2fc40 61 74 65 6d 65 6e 74 20 69 53 74 6d 74 2e 20 49  atement iStmt. I
2fc50 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6e  f there are no n
2fc60 65 77 20 72 65 63 6f 6d 6d 65 64 65 64 20 69 6e  ew recommeded in
2fc70 64 65 78 65 73 2c 20 4e 55 4c 4c 20 0a 2a 2a 20  dexes, NULL .** 
2fc80 20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a    is returned..*
2fc90 2a 0a 2a 2a 20 45 58 50 45 52 54 5f 52 45 50 4f  *.** EXPERT_REPO
2fca0 52 54 5f 50 4c 41 4e 3a 0a 2a 2a 20 20 20 52 65  RT_PLAN:.**   Re
2fcb0 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 63 6f  turn a buffer co
2fcc0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 45 58 50  ntaining the EXP
2fcd0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2fce0 6f 75 74 70 75 74 20 66 6f 72 20 53 51 4c 20 71  output for SQL q
2fcf0 75 65 72 79 0a 2a 2a 20 20 20 69 53 74 6d 74 20  uery.**   iStmt 
2fd00 61 66 74 65 72 20 74 68 65 20 70 72 6f 70 6f 73  after the propos
2fd10 65 64 20 69 6e 64 65 78 65 73 20 68 61 76 65 20  ed indexes have 
2fd20 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68  been added to th
2fd30 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2fd40 61 2e 0a 2a 2a 0a 2a 2a 20 45 58 50 45 52 54 5f  a..**.** EXPERT_
2fd50 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45  REPORT_CANDIDATE
2fd60 53 3a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61  S:.**   Return a
2fd70 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
2fd80 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2fd90 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
2fda0 20 73 74 61 74 65 6d 65 6e 74 73 20 0a 2a 2a 20   statements .** 
2fdb0 20 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65 78 65    for all indexe
2fdc0 73 20 74 68 61 74 20 77 65 72 65 20 74 65 73 74  s that were test
2fdd0 65 64 20 28 66 6f 72 20 61 6c 6c 20 53 51 4c 20  ed (for all SQL 
2fde0 73 74 61 74 65 6d 65 6e 74 73 29 2e 20 54 68 65  statements). The
2fdf0 20 69 53 74 6d 74 0a 2a 2a 20 20 20 70 61 72 61   iStmt.**   para
2fe00 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64  meter is ignored
2fe10 20 66 6f 72 20 45 58 50 45 52 54 5f 52 45 50 4f   for EXPERT_REPO
2fe20 52 54 5f 43 41 4e 44 49 44 41 54 45 53 20 63 61  RT_CANDIDATES ca
2fe30 6c 6c 73 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  lls..*/.const ch
2fe40 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 78 70 65  ar *sqlite3_expe
2fe50 72 74 5f 72 65 70 6f 72 74 28 73 71 6c 69 74 65  rt_report(sqlite
2fe60 33 65 78 70 65 72 74 2a 2c 20 69 6e 74 20 69 53  3expert*, int iS
2fe70 74 6d 74 2c 20 69 6e 74 20 65 52 65 70 6f 72 74  tmt, int eReport
2fe80 29 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 73  );../*.** Values
2fe90 20 66 6f 72 20 74 68 65 20 74 68 69 72 64 20 61   for the third a
2fea0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
2feb0 6f 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  o sqlite3_expert
2fec0 5f 72 65 70 6f 72 74 28 29 2e 0a 2a 2f 0a 23 64  _report()..*/.#d
2fed0 65 66 69 6e 65 20 45 58 50 45 52 54 5f 52 45 50  efine EXPERT_REP
2fee0 4f 52 54 5f 53 51 4c 20 20 20 20 20 20 20 20 31  ORT_SQL        1
2fef0 0a 23 64 65 66 69 6e 65 20 45 58 50 45 52 54 5f  .#define EXPERT_
2ff00 52 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 20 20  REPORT_INDEXES  
2ff10 20 20 32 0a 23 64 65 66 69 6e 65 20 45 58 50 45    2.#define EXPE
2ff20 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 20 20  RT_REPORT_PLAN  
2ff30 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 45       3.#define E
2ff40 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e  XPERT_REPORT_CAN
2ff50 44 49 44 41 54 45 53 20 34 0a 0a 2f 2a 0a 2a 2a  DIDATES 4../*.**
2ff60 20 46 72 65 65 20 61 6e 20 28 73 71 6c 69 74 65   Free an (sqlite
2ff70 33 65 78 70 65 72 74 2a 29 20 68 61 6e 64 6c 65  3expert*) handle
2ff80 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
2ff90 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 20 54  ted resources. T
2ffa0 68 65 72 65 20 0a 2a 2a 20 73 68 6f 75 6c 64 20  here .** should 
2ffb0 62 65 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 74  be one call to t
2ffc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  his function for
2ffd0 20 65 61 63 68 20 73 75 63 63 65 73 73 66 75 6c   each successful
2ffe0 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
2fff0 69 74 65 33 2d 65 78 70 65 72 74 5f 6e 65 77 28  ite3-expert_new(
30000 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
30010 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74 72 6f  e3_expert_destro
30020 79 28 73 71 6c 69 74 65 33 65 78 70 65 72 74 2a  y(sqlite3expert*
30030 29 3b 0a 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  );..../*********
30040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30050 20 45 6e 64 20 2e 2e 2f 65 78 74 2f 65 78 70 65   End ../ext/expe
30060 72 74 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74  rt/sqlite3expert
30070 2e 68 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h *************
30080 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a  *******/./******
30090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
300a0 2a 2a 2a 20 42 65 67 69 6e 20 2e 2e 2f 65 78 74  *** Begin ../ext
300b0 2f 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65  /expert/sqlite3e
300c0 78 70 65 72 74 2e 63 20 2a 2a 2a 2a 2a 2a 2a 2a  xpert.c ********
300d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
300e0 2a 20 32 30 31 37 20 41 70 72 69 6c 20 30 39 0a  * 2017 April 09.
300f0 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72  **.** The author
30100 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
30110 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
30120 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
30130 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67 61  ace of.** a lega
30140 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
30150 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a 2a  s a blessing:.**
30160 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64  .**    May you d
30170 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65  o good and not e
30180 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79  vil..**    May y
30190 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e  ou find forgiven
301a0 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66  ess for yourself
301b0 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68   and forgive oth
301c0 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79  ers..**    May y
301d0 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c  ou share freely,
301e0 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f   never taking mo
301f0 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65  re than you give
30200 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
30210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
30250 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  /.#include <asse
30260 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  rt.h>.#include <
30270 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
30280 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 0a 23 69  de <stdio.h>..#i
30290 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
302a0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 0a  T_VIRTUALTABLE .
302b0 0a 2f 2a 20 74 79 70 65 64 65 66 20 73 71 6c 69  ./* typedef sqli
302c0 74 65 33 5f 69 6e 74 36 34 20 69 36 34 3b 20 2a  te3_int64 i64; *
302d0 2f 0a 2f 2a 20 74 79 70 65 64 65 66 20 73 71 6c  /./* typedef sql
302e0 69 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34 3b  ite3_uint64 u64;
302f0 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
30300 75 63 74 20 49 64 78 43 6f 6c 75 6d 6e 20 49 64  uct IdxColumn Id
30310 78 43 6f 6c 75 6d 6e 3b 0a 74 79 70 65 64 65 66  xColumn;.typedef
30320 20 73 74 72 75 63 74 20 49 64 78 43 6f 6e 73 74   struct IdxConst
30330 72 61 69 6e 74 20 49 64 78 43 6f 6e 73 74 72 61  raint IdxConstra
30340 69 6e 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72  int;.typedef str
30350 75 63 74 20 49 64 78 53 63 61 6e 20 49 64 78 53  uct IdxScan IdxS
30360 63 61 6e 3b 0a 74 79 70 65 64 65 66 20 73 74 72  can;.typedef str
30370 75 63 74 20 49 64 78 53 74 61 74 65 6d 65 6e 74  uct IdxStatement
30380 20 49 64 78 53 74 61 74 65 6d 65 6e 74 3b 0a 74   IdxStatement;.t
30390 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64  ypedef struct Id
303a0 78 54 61 62 6c 65 20 49 64 78 54 61 62 6c 65 3b  xTable IdxTable;
303b0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
303c0 49 64 78 57 72 69 74 65 20 49 64 78 57 72 69 74  IdxWrite IdxWrit
303d0 65 3b 0a 0a 23 64 65 66 69 6e 65 20 53 54 52 4c  e;..#define STRL
303e0 45 4e 20 20 28 69 6e 74 29 73 74 72 6c 65 6e 0a  EN  (int)strlen.
303f0 0a 2f 2a 0a 2a 2a 20 41 20 74 65 6d 70 20 74 61  ./*.** A temp ta
30400 62 6c 65 20 6e 61 6d 65 20 74 68 61 74 20 77 65  ble name that we
30410 20 61 73 73 75 6d 65 20 6e 6f 20 75 73 65 72 20   assume no user 
30420 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 63  database will ac
30430 74 75 61 6c 6c 79 20 75 73 65 2e 0a 2a 2a 20 49  tually use..** I
30440 66 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  f this assumptio
30450 6e 20 70 72 6f 76 65 73 20 69 6e 63 6f 72 72 65  n proves incorre
30460 63 74 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74  ct triggers on t
30470 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
30480 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 69 6e 67  e.** conflicting
30490 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 69 67   name will be ig
304a0 6e 6f 72 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  nored..*/.#defin
304b0 65 20 55 4e 49 51 55 45 5f 54 41 42 4c 45 5f 4e  e UNIQUE_TABLE_N
304c0 41 4d 45 20 22 74 35 39 32 36 39 30 39 31 36 37  AME "t5926909167
304d0 32 31 30 35 33 39 35 33 38 30 35 37 30 31 36 32  2105395380570162
304e0 37 39 32 31 32 32 37 37 37 36 22 0a 0a 2f 2a 0a  7921227776"../*.
304f0 2a 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73  ** A single cons
30500 74 72 61 69 6e 74 2e 20 45 71 75 69 76 61 6c 65  traint. Equivale
30510 6e 74 20 74 6f 20 65 69 74 68 65 72 20 22 63 6f  nt to either "co
30520 6c 20 3d 20 3f 22 20 6f 72 20 22 63 6f 6c 20 3c  l = ?" or "col <
30530 20 3f 22 20 28 6f 72 0a 2a 2a 20 61 6e 79 20 6f   ?" (or.** any o
30540 74 68 65 72 20 74 79 70 65 20 6f 66 20 73 69 6e  ther type of sin
30550 67 6c 65 2d 65 6e 64 65 64 20 72 61 6e 67 65 20  gle-ended range 
30560 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 61 20  constraint on a 
30570 63 6f 6c 75 6d 6e 29 2e 0a 2a 2a 0a 2a 2a 20 70  column)..**.** p
30580 4c 69 6e 6b 3a 0a 2a 2a 20 20 20 55 73 65 64 20  Link:.**   Used 
30590 74 6f 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 6c  to temporarily l
305a0 69 6e 6b 20 49 64 78 43 6f 6e 73 74 72 61 69 6e  ink IdxConstrain
305b0 74 20 6f 62 6a 65 63 74 73 20 69 6e 74 6f 20 6c  t objects into l
305c0 69 73 74 73 20 77 68 69 6c 65 0a 2a 2a 20 20 20  ists while.**   
305d0 63 72 65 61 74 69 6e 67 20 63 61 6e 64 69 64 61  creating candida
305e0 74 65 20 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 73  te indexes..*/.s
305f0 74 72 75 63 74 20 49 64 78 43 6f 6e 73 74 72 61  truct IdxConstra
30600 69 6e 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 43  int {.  char *zC
30610 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
30620 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
30630 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
30640 0a 20 20 69 6e 74 20 62 52 61 6e 67 65 3b 20 20  .  int bRange;  
30650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30660 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 72     /* True for r
30670 61 6e 67 65 2c 20 66 61 6c 73 65 20 66 6f 72 20  ange, false for 
30680 65 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  eq */.  int iCol
30690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
306a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74          /* Const
306b0 72 61 69 6e 65 64 20 74 61 62 6c 65 20 63 6f 6c  rained table col
306c0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c  umn */.  int bFl
306d0 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ag;             
306e0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
306f0 20 62 79 20 69 64 78 46 69 6e 64 43 6f 6d 70 61   by idxFindCompa
30700 74 69 62 6c 65 28 29 20 2a 2f 0a 20 20 69 6e 74  tible() */.  int
30710 20 62 44 65 73 63 3b 20 20 20 20 20 20 20 20 20   bDesc;         
30720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30730 54 72 75 65 20 69 66 20 4f 52 44 45 52 20 42 59  True if ORDER BY
30740 20 3c 65 78 70 72 3e 20 44 45 53 43 20 2a 2f 0a   <expr> DESC */.
30750 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
30760 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
30770 20 20 2f 2a 20 4e 65 78 74 20 63 6f 6e 73 74 72    /* Next constr
30780 61 69 6e 74 20 69 6e 20 70 45 71 20 6f 72 20 70  aint in pEq or p
30790 52 61 6e 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20  Range list */.  
307a0 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  IdxConstraint *p
307b0 4c 69 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Link;           
307c0 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
307d0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67  };../*.** A sing
307e0 6c 65 20 73 63 61 6e 20 6f 66 20 61 20 73 69 6e  le scan of a sin
307f0 67 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  gle table..*/.st
30800 72 75 63 74 20 49 64 78 53 63 61 6e 20 7b 0a 20  ruct IdxScan {. 
30810 20 49 64 78 54 61 62 6c 65 20 2a 70 54 61 62 3b   IdxTable *pTab;
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30830 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 74   /* Associated t
30840 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  able object */. 
30850 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
30860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30870 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
30880 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 20 7a 54  taining table zT
30890 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 63 6f  able */.  i64 co
308a0 76 65 72 69 6e 67 3b 20 20 20 20 20 20 20 20 20  vering;         
308b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
308c0 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 71  k of columns req
308d0 75 69 72 65 64 20 66 6f 72 20 63 6f 76 2e 20 69  uired for cov. i
308e0 6e 64 65 78 20 2a 2f 0a 20 20 49 64 78 43 6f 6e  ndex */.  IdxCon
308f0 73 74 72 61 69 6e 74 20 2a 70 4f 72 64 65 72 3b  straint *pOrder;
30900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
30910 45 52 20 42 59 20 63 6f 6c 75 6d 6e 73 20 2a 2f  ER BY columns */
30920 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74  .  IdxConstraint
30930 20 2a 70 45 71 3b 20 20 20 20 20 20 20 20 20 20   *pEq;          
30940 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 3d 3d     /* List of ==
30950 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
30960 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
30970 2a 70 52 61 6e 67 65 3b 20 20 20 20 20 20 20 20  *pRange;        
30980 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 3c 20 63    /* List of < c
30990 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
309a0 49 64 78 53 63 61 6e 20 2a 70 4e 65 78 74 53 63  IdxScan *pNextSc
309b0 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
309c0 2f 2a 20 4e 65 78 74 20 49 64 78 53 63 61 6e 20  /* Next IdxScan 
309d0 6f 62 6a 65 63 74 20 66 6f 72 20 73 61 6d 65 20  object for same 
309e0 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 7d 3b 0a 0a  analysis */.};..
309f0 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
30a00 6e 20 72 65 67 61 72 64 69 6e 67 20 61 20 73 69  n regarding a si
30a10 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 61  ngle database ta
30a20 62 6c 65 2e 20 45 78 74 72 61 63 74 65 64 20 66  ble. Extracted f
30a30 72 6f 6d 20 0a 2a 2a 20 22 50 52 41 47 4d 41 20  rom .** "PRAGMA 
30a40 74 61 62 6c 65 5f 69 6e 66 6f 22 20 62 79 20 66  table_info" by f
30a50 75 6e 63 74 69 6f 6e 20 69 64 78 47 65 74 54 61  unction idxGetTa
30a60 62 6c 65 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74  bleInfo()..*/.st
30a70 72 75 63 74 20 49 64 78 43 6f 6c 75 6d 6e 20 7b  ruct IdxColumn {
30a80 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
30a90 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
30aa0 20 69 6e 74 20 69 50 6b 3b 0a 7d 3b 0a 73 74 72   int iPk;.};.str
30ab0 75 63 74 20 49 64 78 54 61 62 6c 65 20 7b 0a 20  uct IdxTable {. 
30ac0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61   int nCol;.  cha
30ad0 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30af0 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
30b00 49 64 78 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b  IdxColumn *aCol;
30b10 0a 20 20 49 64 78 54 61 62 6c 65 20 2a 70 4e 65  .  IdxTable *pNe
30b20 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
30b30 20 20 20 2f 2a 20 4e 65 78 74 20 74 61 62 6c 65     /* Next table
30b40 20 69 6e 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20   in linked list 
30b50 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 2a 2f  of all tables */
30b60 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62  .};../*.** An ob
30b70 6a 65 63 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ject of the foll
30b80 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20 63 72  owing type is cr
30b90 65 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 75  eated for each u
30ba0 6e 69 71 75 65 20 74 61 62 6c 65 2f 77 72 69 74  nique table/writ
30bb0 65 2d 6f 70 0a 2a 2a 20 73 65 65 6e 2e 20 54 68  e-op.** seen. Th
30bc0 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 73 74  e objects are st
30bd0 6f 72 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 79  ored in a singly
30be0 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62 65 67  -linked list beg
30bf0 69 6e 6e 69 6e 67 20 61 74 0a 2a 2a 20 73 71 6c  inning at.** sql
30c00 69 74 65 33 65 78 70 65 72 74 2e 70 57 72 69 74  ite3expert.pWrit
30c10 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78  e..*/.struct Idx
30c20 57 72 69 74 65 20 7b 0a 20 20 49 64 78 54 61 62  Write {.  IdxTab
30c30 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74 20  le *pTab;.  int 
30c40 65 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  eOp;            
30c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30c60 51 4c 49 54 45 5f 55 50 44 41 54 45 2c 20 44 45  QLITE_UPDATE, DE
30c70 4c 45 54 45 20 6f 72 20 49 4e 53 45 52 54 20 2a  LETE or INSERT *
30c80 2f 0a 20 20 49 64 78 57 72 69 74 65 20 2a 70 4e  /.  IdxWrite *pN
30c90 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  ext;.};../*.** E
30ca0 61 63 68 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ach statement be
30cb0 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 69 73 20  ing analyzed is 
30cc0 72 65 70 72 65 73 65 6e 74 65 64 20 62 79 20 61  represented by a
30cd0 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
30ce0 69 73 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  is.** structure.
30cf0 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 53 74  .*/.struct IdxSt
30d00 61 74 65 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20  atement {.  int 
30d10 69 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  iId;            
30d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30d30 74 61 74 65 6d 65 6e 74 20 6e 75 6d 62 65 72 20  tatement number 
30d40 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  */.  char *zSql;
30d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d60 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74       /* SQL stat
30d70 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20  ement */.  char 
30d80 2a 7a 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *zIdx;          
30d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30da0 64 65 78 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  dexes */.  char 
30db0 2a 7a 45 51 50 3b 20 20 20 20 20 20 20 20 20 20  *zEQP;          
30dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c             /* Pl
30dd0 61 6e 20 2a 2f 0a 20 20 49 64 78 53 74 61 74 65  an */.  IdxState
30de0 6d 65 6e 74 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a  ment *pNext;.};.
30df0 0a 0a 2f 2a 0a 2a 2a 20 41 20 68 61 73 68 20 74  ../*.** A hash t
30e00 61 62 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  able for storing
30e10 20 73 74 72 69 6e 67 73 2e 20 57 69 74 68 20 73   strings. With s
30e20 70 61 63 65 20 66 6f 72 20 61 20 70 61 79 6c 6f  pace for a paylo
30e30 61 64 20 73 74 72 69 6e 67 0a 2a 2a 20 77 69 74  ad string.** wit
30e40 68 20 65 61 63 68 20 65 6e 74 72 79 2e 20 4d 65  h each entry. Me
30e50 74 68 6f 64 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  thods are:.**.**
30e60 20 20 20 69 64 78 48 61 73 68 49 6e 69 74 28 29     idxHashInit()
30e70 0a 2a 2a 20 20 20 69 64 78 48 61 73 68 43 6c 65  .**   idxHashCle
30e80 61 72 28 29 0a 2a 2a 20 20 20 69 64 78 48 61 73  ar().**   idxHas
30e90 68 41 64 64 28 29 0a 2a 2a 20 20 20 69 64 78 48  hAdd().**   idxH
30ea0 61 73 68 53 65 61 72 63 68 28 29 0a 2a 2f 0a 23  ashSearch().*/.#
30eb0 64 65 66 69 6e 65 20 49 44 58 5f 48 41 53 48 5f  define IDX_HASH_
30ec0 53 49 5a 45 20 31 30 32 33 0a 74 79 70 65 64 65  SIZE 1023.typede
30ed0 66 20 73 74 72 75 63 74 20 49 64 78 48 61 73 68  f struct IdxHash
30ee0 45 6e 74 72 79 20 49 64 78 48 61 73 68 45 6e 74  Entry IdxHashEnt
30ef0 72 79 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ry;.typedef stru
30f00 63 74 20 49 64 78 48 61 73 68 20 49 64 78 48 61  ct IdxHash IdxHa
30f10 73 68 3b 0a 73 74 72 75 63 74 20 49 64 78 48 61  sh;.struct IdxHa
30f20 73 68 45 6e 74 72 79 20 7b 0a 20 20 63 68 61 72  shEntry {.  char
30f30 20 2a 7a 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *zKey;         
30f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e              /* n
30f50 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6b 65  ul-terminated ke
30f60 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 56 61  y */.  char *zVa
30f70 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
30f80 20 20 20 20 20 20 20 2f 2a 20 6e 75 6c 2d 74 65         /* nul-te
30f90 72 6d 69 6e 61 74 65 64 20 76 61 6c 75 65 20 73  rminated value s
30fa0 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
30fb0 2a 7a 56 61 6c 32 3b 20 20 20 20 20 20 20 20 20  *zVal2;         
30fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75             /* nu
30fd0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 76 61 6c  l-terminated val
30fe0 75 65 20 73 74 72 69 6e 67 20 32 20 2a 2f 0a 20  ue string 2 */. 
30ff0 20 49 64 78 48 61 73 68 45 6e 74 72 79 20 2a 70   IdxHashEntry *p
31000 48 61 73 68 4e 65 78 74 3b 20 20 20 20 20 20 20  HashNext;       
31010 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
31020 6e 20 73 61 6d 65 20 68 61 73 68 20 62 75 63 6b  n same hash buck
31030 65 74 20 2a 2f 0a 20 20 49 64 78 48 61 73 68 45  et */.  IdxHashE
31040 6e 74 72 79 20 2a 70 4e 65 78 74 3b 20 20 20 20  ntry *pNext;    
31050 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
31060 65 6e 74 72 79 20 69 6e 20 68 61 73 68 20 2a 2f  entry in hash */
31070 0a 7d 3b 0a 73 74 72 75 63 74 20 49 64 78 48 61  .};.struct IdxHa
31080 73 68 20 7b 0a 20 20 49 64 78 48 61 73 68 45 6e  sh {.  IdxHashEn
31090 74 72 79 20 2a 70 46 69 72 73 74 3b 0a 20 20 49  try *pFirst;.  I
310a0 64 78 48 61 73 68 45 6e 74 72 79 20 2a 61 48 61  dxHashEntry *aHa
310b0 73 68 5b 49 44 58 5f 48 41 53 48 5f 53 49 5a 45  sh[IDX_HASH_SIZE
310c0 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  ];.};../*.** sql
310d0 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63  ite3expert objec
310e0 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c  t..*/.struct sql
310f0 69 74 65 33 65 78 70 65 72 74 20 7b 0a 20 20 69  ite3expert {.  i
31100 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20 20  nt iSample;     
31110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31120 2a 20 50 65 72 63 65 6e 74 61 67 65 20 6f 66 20  * Percentage of 
31130 74 61 62 6c 65 73 20 74 6f 20 73 61 6d 70 6c 65  tables to sample
31140 20 66 6f 72 20 73 74 61 74 31 20 2a 2f 0a 20 20   for stat1 */.  
31150 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
31160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31170 2f 2a 20 55 73 65 72 20 64 61 74 61 62 61 73 65  /* User database
31180 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
31190 62 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bm;             
311a0 20 20 20 20 20 20 2f 2a 20 49 6e 2d 6d 65 6d 6f        /* In-memo
311b0 72 79 20 64 62 20 66 6f 72 20 74 68 69 73 20 61  ry db for this a
311c0 6e 61 6c 79 73 69 73 20 2a 2f 0a 20 20 73 71 6c  nalysis */.  sql
311d0 69 74 65 33 20 2a 64 62 76 3b 20 20 20 20 20 20  ite3 *dbv;      
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311f0 56 74 61 62 20 73 63 68 65 6d 61 20 66 6f 72 20  Vtab schema for 
31200 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 2a 2f  this analysis */
31210 0a 20 20 49 64 78 54 61 62 6c 65 20 2a 70 54 61  .  IdxTable *pTa
31220 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ble;            
31230 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
31240 6c 20 49 64 78 54 61 62 6c 65 20 6f 62 6a 65 63  l IdxTable objec
31250 74 73 20 2a 2f 0a 20 20 49 64 78 53 63 61 6e 20  ts */.  IdxScan 
31260 2a 70 53 63 61 6e 3b 20 20 20 20 20 20 20 20 20  *pScan;         
31270 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
31280 6f 66 20 73 63 61 6e 20 6f 62 6a 65 63 74 73 20  of scan objects 
31290 2a 2f 0a 20 20 49 64 78 57 72 69 74 65 20 2a 70  */.  IdxWrite *p
312a0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
312b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
312c0 77 72 69 74 65 20 6f 62 6a 65 63 74 73 20 2a 2f  write objects */
312d0 0a 20 20 49 64 78 53 74 61 74 65 6d 65 6e 74 20  .  IdxStatement 
312e0 2a 70 53 74 61 74 65 6d 65 6e 74 3b 20 20 20 20  *pStatement;    
312f0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 49 64     /* List of Id
31300 78 53 74 61 74 65 6d 65 6e 74 20 6f 62 6a 65 63  xStatement objec
31310 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62 52 75 6e  ts */.  int bRun
31320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31330 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
31340 6f 6e 63 65 20 61 6e 61 6c 79 73 69 73 20 68 61  once analysis ha
31350 73 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20  s run */.  char 
31360 2a 2a 70 7a 45 72 72 6d 73 67 3b 0a 20 20 69 6e  **pzErrmsg;.  in
31370 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
31380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31390 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   Error code from
313a0 20 77 68 65 72 65 69 6e 66 6f 20 68 6f 6f 6b 20   whereinfo hook 
313b0 2a 2f 0a 20 20 49 64 78 48 61 73 68 20 68 49 64  */.  IdxHash hId
313c0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
313d0 20 20 20 20 20 2f 2a 20 48 61 73 68 20 63 6f 6e       /* Hash con
313e0 74 61 69 6e 69 6e 67 20 61 6c 6c 20 63 61 6e 64  taining all cand
313f0 69 64 61 74 65 20 69 6e 64 65 78 65 73 20 2a 2f  idate indexes */
31400 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 64 69 64  .  char *zCandid
31410 61 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ates;           
31420 20 20 20 2f 2a 20 46 6f 72 20 45 58 50 45 52 54     /* For EXPERT
31430 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54  _REPORT_CANDIDAT
31440 45 53 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  ES */.};.../*.**
31450 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
31460 74 75 72 6e 20 6e 42 79 74 65 20 62 79 74 65 73  turn nByte bytes
31470 20 6f 66 20 7a 65 72 6f 65 64 20 6d 65 6d 6f 72   of zeroed memor
31480 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  y using sqlite3_
31490 6d 61 6c 6c 6f 63 28 29 2e 20 0a 2a 2a 20 49 66  malloc(). .** If
314a0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
314b0 66 61 69 6c 73 2c 20 73 65 74 20 2a 70 52 63 20  fails, set *pRc 
314c0 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
314d0 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
314e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
314f0 2a 69 64 78 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a  *idxMalloc(int *
31500 70 52 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b  pRc, int nByte){
31510 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
31520 20 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53   assert( *pRc==S
31530 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
31540 73 65 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b  sert( nByte>0 );
31550 0a 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65  .  pRet = sqlite
31560 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
31570 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
31580 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
31590 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  0, nByte);.  }el
315a0 73 65 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53  se{.    *pRc = S
315b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
315c0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
315d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
315e0 69 7a 65 20 61 6e 20 49 64 78 48 61 73 68 20 68  ize an IdxHash h
315f0 61 73 68 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ash table..*/.st
31600 61 74 69 63 20 76 6f 69 64 20 69 64 78 48 61 73  atic void idxHas
31610 68 49 6e 69 74 28 49 64 78 48 61 73 68 20 2a 70  hInit(IdxHash *p
31620 48 61 73 68 29 7b 0a 20 20 6d 65 6d 73 65 74 28  Hash){.  memset(
31630 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  pHash, 0, sizeof
31640 28 49 64 78 48 61 73 68 29 29 3b 0a 7d 0a 0a 2f  (IdxHash));.}../
31650 2a 0a 2a 2a 20 52 65 73 65 74 20 61 6e 20 49 64  *.** Reset an Id
31660 78 48 61 73 68 20 68 61 73 68 20 74 61 62 6c 65  xHash hash table
31670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
31680 20 69 64 78 48 61 73 68 43 6c 65 61 72 28 49 64   idxHashClear(Id
31690 78 48 61 73 68 20 2a 70 48 61 73 68 29 7b 0a 20  xHash *pHash){. 
316a0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
316b0 30 3b 20 69 3c 49 44 58 5f 48 41 53 48 5f 53 49  0; i<IDX_HASH_SI
316c0 5a 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 49 64  ZE; i++){.    Id
316d0 78 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74  xHashEntry *pEnt
316e0 72 79 3b 0a 20 20 20 20 49 64 78 48 61 73 68 45  ry;.    IdxHashE
316f0 6e 74 72 79 20 2a 70 4e 65 78 74 3b 0a 20 20 20  ntry *pNext;.   
31700 20 66 6f 72 28 70 45 6e 74 72 79 3d 70 48 61 73   for(pEntry=pHas
31710 68 2d 3e 61 48 61 73 68 5b 69 5d 3b 20 70 45 6e  h->aHash[i]; pEn
31720 74 72 79 3b 20 70 45 6e 74 72 79 3d 70 4e 65 78  try; pEntry=pNex
31730 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
31740 3d 20 70 45 6e 74 72 79 2d 3e 70 48 61 73 68 4e  = pEntry->pHashN
31750 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
31760 65 33 5f 66 72 65 65 28 70 45 6e 74 72 79 2d 3e  e3_free(pEntry->
31770 7a 56 61 6c 32 29 3b 0a 20 20 20 20 20 20 73 71  zVal2);.      sq
31780 6c 69 74 65 33 5f 66 72 65 65 28 70 45 6e 74 72  lite3_free(pEntr
31790 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y);.    }.  }.  
317a0 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c  memset(pHash, 0,
317b0 20 73 69 7a 65 6f 66 28 49 64 78 48 61 73 68 29   sizeof(IdxHash)
317c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
317d0 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
317e0 74 68 65 20 68 61 73 68 20 62 75 63 6b 65 74 20  the hash bucket 
317f0 74 68 61 74 20 74 68 65 20 73 74 72 69 6e 67 20  that the string 
31800 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
31810 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  .** arguments to
31820 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 62   this function b
31830 65 6c 6f 6e 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  elongs..*/.stati
31840 63 20 69 6e 74 20 69 64 78 48 61 73 68 53 74 72  c int idxHashStr
31850 69 6e 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ing(const char *
31860 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 75 6e 73  z, int n){.  uns
31870 69 67 6e 65 64 20 69 6e 74 20 72 65 74 20 3d 20  igned int ret = 
31880 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
31890 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
318a0 7b 0a 20 20 20 20 72 65 74 20 2b 3d 20 28 72 65  {.    ret += (re
318b0 74 3c 3c 33 29 20 2b 20 28 75 6e 73 69 67 6e 65  t<<3) + (unsigne
318c0 64 20 63 68 61 72 29 28 7a 5b 69 5d 29 3b 0a 20  d char)(z[i]);. 
318d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
318e0 29 28 72 65 74 20 25 20 49 44 58 5f 48 41 53 48  )(ret % IDX_HASH
318f0 5f 53 49 5a 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _SIZE);.}../*.**
31900 20 49 66 20 7a 4b 65 79 20 69 73 20 61 6c 72 65   If zKey is alre
31910 61 64 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ady present in t
31920 68 65 20 68 61 73 68 20 74 61 62 6c 65 2c 20 72  he hash table, r
31930 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 61  eturn non-zero a
31940 6e 64 20 64 6f 0a 2a 2a 20 6e 6f 74 68 69 6e 67  nd do.** nothing
31950 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 64 64  . Otherwise, add
31960 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 6b   an entry with k
31970 65 79 20 7a 4b 65 79 20 61 6e 64 20 70 61 79 6c  ey zKey and payl
31980 6f 61 64 20 73 74 72 69 6e 67 20 7a 56 61 6c 20  oad string zVal 
31990 74 6f 0a 2a 2a 20 74 68 65 20 68 61 73 68 20 74  to.** the hash t
319a0 61 62 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  able passed as t
319b0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
319c0 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nt. .*/.static i
319d0 6e 74 20 69 64 78 48 61 73 68 41 64 64 28 0a 20  nt idxHashAdd(. 
319e0 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 49 64   int *pRc, .  Id
319f0 78 48 61 73 68 20 2a 70 48 61 73 68 2c 20 0a 20  xHash *pHash, . 
31a00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
31a10 79 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  y,.  const char 
31a20 2a 7a 56 61 6c 0a 29 7b 0a 20 20 69 6e 74 20 6e  *zVal.){.  int n
31a30 4b 65 79 20 3d 20 53 54 52 4c 45 4e 28 7a 4b 65  Key = STRLEN(zKe
31a40 79 29 3b 0a 20 20 69 6e 74 20 69 48 61 73 68 20  y);.  int iHash 
31a50 3d 20 69 64 78 48 61 73 68 53 74 72 69 6e 67 28  = idxHashString(
31a60 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 69  zKey, nKey);.  i
31a70 6e 74 20 6e 56 61 6c 20 3d 20 28 7a 56 61 6c 20  nt nVal = (zVal 
31a80 3f 20 53 54 52 4c 45 4e 28 7a 56 61 6c 29 20 3a  ? STRLEN(zVal) :
31a90 20 30 29 3b 0a 20 20 49 64 78 48 61 73 68 45 6e   0);.  IdxHashEn
31aa0 74 72 79 20 2a 70 45 6e 74 72 79 3b 0a 20 20 61  try *pEntry;.  a
31ab0 73 73 65 72 74 28 20 69 48 61 73 68 3e 3d 30 20  ssert( iHash>=0 
31ac0 29 3b 0a 20 20 66 6f 72 28 70 45 6e 74 72 79 3d  );.  for(pEntry=
31ad0 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 69 48 61  pHash->aHash[iHa
31ae0 73 68 5d 3b 20 70 45 6e 74 72 79 3b 20 70 45 6e  sh]; pEntry; pEn
31af0 74 72 79 3d 70 45 6e 74 72 79 2d 3e 70 48 61 73  try=pEntry->pHas
31b00 68 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  hNext){.    if( 
31b10 53 54 52 4c 45 4e 28 70 45 6e 74 72 79 2d 3e 7a  STRLEN(pEntry->z
31b20 4b 65 79 29 3d 3d 6e 4b 65 79 20 26 26 20 30 3d  Key)==nKey && 0=
31b30 3d 6d 65 6d 63 6d 70 28 70 45 6e 74 72 79 2d 3e  =memcmp(pEntry->
31b40 7a 4b 65 79 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  zKey, zKey, nKey
31b50 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
31b60 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
31b70 20 70 45 6e 74 72 79 20 3d 20 69 64 78 4d 61 6c   pEntry = idxMal
31b80 6c 6f 63 28 70 52 63 2c 20 73 69 7a 65 6f 66 28  loc(pRc, sizeof(
31b90 49 64 78 48 61 73 68 45 6e 74 72 79 29 20 2b 20  IdxHashEntry) + 
31ba0 6e 4b 65 79 2b 31 20 2b 20 6e 56 61 6c 2b 31 29  nKey+1 + nVal+1)
31bb0 3b 0a 20 20 69 66 28 20 70 45 6e 74 72 79 20 29  ;.  if( pEntry )
31bc0 7b 0a 20 20 20 20 70 45 6e 74 72 79 2d 3e 7a 4b  {.    pEntry->zK
31bd0 65 79 20 3d 20 28 63 68 61 72 2a 29 26 70 45 6e  ey = (char*)&pEn
31be0 74 72 79 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  try[1];.    memc
31bf0 70 79 28 70 45 6e 74 72 79 2d 3e 7a 4b 65 79 2c  py(pEntry->zKey,
31c00 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   zKey, nKey);.  
31c10 20 20 69 66 28 20 7a 56 61 6c 20 29 7b 0a 20 20    if( zVal ){.  
31c20 20 20 20 20 70 45 6e 74 72 79 2d 3e 7a 56 61 6c      pEntry->zVal
31c30 20 3d 20 26 70 45 6e 74 72 79 2d 3e 7a 4b 65 79   = &pEntry->zKey
31c40 5b 6e 4b 65 79 2b 31 5d 3b 0a 20 20 20 20 20 20  [nKey+1];.      
31c50 6d 65 6d 63 70 79 28 70 45 6e 74 72 79 2d 3e 7a  memcpy(pEntry->z
31c60 56 61 6c 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c 29  Val, zVal, nVal)
31c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 6e 74  ;.    }.    pEnt
31c80 72 79 2d 3e 70 48 61 73 68 4e 65 78 74 20 3d 20  ry->pHashNext = 
31c90 70 48 61 73 68 2d 3e 61 48 61 73 68 5b 69 48 61  pHash->aHash[iHa
31ca0 73 68 5d 3b 0a 20 20 20 20 70 48 61 73 68 2d 3e  sh];.    pHash->
31cb0 61 48 61 73 68 5b 69 48 61 73 68 5d 20 3d 20 70  aHash[iHash] = p
31cc0 45 6e 74 72 79 3b 0a 0a 20 20 20 20 70 45 6e 74  Entry;..    pEnt
31cd0 72 79 2d 3e 70 4e 65 78 74 20 3d 20 70 48 61 73  ry->pNext = pHas
31ce0 68 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 70  h->pFirst;.    p
31cf0 48 61 73 68 2d 3e 70 46 69 72 73 74 20 3d 20 70  Hash->pFirst = p
31d00 45 6e 74 72 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Entry;.  }.  ret
31d10 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
31d20 49 66 20 7a 4b 65 79 2f 6e 4b 65 79 20 69 73 20  If zKey/nKey is 
31d30 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68  present in the h
31d40 61 73 68 20 74 61 62 6c 65 2c 20 72 65 74 75 72  ash table, retur
31d50 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
31d60 68 65 20 0a 2a 2a 20 68 61 73 68 2d 65 6e 74 72  he .** hash-entr
31d70 79 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  y object..*/.sta
31d80 74 69 63 20 49 64 78 48 61 73 68 45 6e 74 72 79  tic IdxHashEntry
31d90 20 2a 69 64 78 48 61 73 68 46 69 6e 64 28 49 64   *idxHashFind(Id
31da0 78 48 61 73 68 20 2a 70 48 61 73 68 2c 20 63 6f  xHash *pHash, co
31db0 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20  nst char *zKey, 
31dc0 69 6e 74 20 6e 4b 65 79 29 7b 0a 20 20 69 6e 74  int nKey){.  int
31dd0 20 69 48 61 73 68 3b 0a 20 20 49 64 78 48 61 73   iHash;.  IdxHas
31de0 68 45 6e 74 72 79 20 2a 70 45 6e 74 72 79 3b 0a  hEntry *pEntry;.
31df0 20 20 69 66 28 20 6e 4b 65 79 3c 30 20 29 20 6e    if( nKey<0 ) n
31e00 4b 65 79 20 3d 20 53 54 52 4c 45 4e 28 7a 4b 65  Key = STRLEN(zKe
31e10 79 29 3b 0a 20 20 69 48 61 73 68 20 3d 20 69 64  y);.  iHash = id
31e20 78 48 61 73 68 53 74 72 69 6e 67 28 7a 4b 65 79  xHashString(zKey
31e30 2c 20 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  , nKey);.  asser
31e40 74 28 20 69 48 61 73 68 3e 3d 30 20 29 3b 0a 20  t( iHash>=0 );. 
31e50 20 66 6f 72 28 70 45 6e 74 72 79 3d 70 48 61 73   for(pEntry=pHas
31e60 68 2d 3e 61 48 61 73 68 5b 69 48 61 73 68 5d 3b  h->aHash[iHash];
31e70 20 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d   pEntry; pEntry=
31e80 70 45 6e 74 72 79 2d 3e 70 48 61 73 68 4e 65 78  pEntry->pHashNex
31e90 74 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 4c  t){.    if( STRL
31ea0 45 4e 28 70 45 6e 74 72 79 2d 3e 7a 4b 65 79 29  EN(pEntry->zKey)
31eb0 3d 3d 6e 4b 65 79 20 26 26 20 30 3d 3d 6d 65 6d  ==nKey && 0==mem
31ec0 63 6d 70 28 70 45 6e 74 72 79 2d 3e 7a 4b 65 79  cmp(pEntry->zKey
31ed0 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 20 29 7b  , zKey, nKey) ){
31ee0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 45  .      return pE
31ef0 6e 74 72 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ntry;.    }.  }.
31f00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
31f10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 61 73 68  *.** If the hash
31f20 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20   table contains 
31f30 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
31f40 6b 65 79 20 65 71 75 61 6c 20 74 6f 20 74 68 65  key equal to the
31f50 20 73 74 72 69 6e 67 0a 2a 2a 20 70 61 73 73 65   string.** passe
31f60 64 20 61 73 20 74 68 65 20 66 69 6e 61 6c 20 74  d as the final t
31f70 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  wo arguments to 
31f80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 72  this function, r
31f90 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
31fa0 2a 2a 20 74 6f 20 74 68 65 20 70 61 79 6c 6f 61  ** to the payloa
31fb0 64 20 73 74 72 69 6e 67 2e 20 4f 74 68 65 72 77  d string. Otherw
31fc0 69 73 65 2c 20 69 66 20 7a 4b 65 79 2f 6e 4b 65  ise, if zKey/nKe
31fd0 79 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  y is not present
31fe0 20 69 6e 20 74 68 65 0a 2a 2a 20 68 61 73 68 20   in the.** hash 
31ff0 74 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55  table, return NU
32000 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  LL..*/.static co
32010 6e 73 74 20 63 68 61 72 20 2a 69 64 78 48 61 73  nst char *idxHas
32020 68 53 65 61 72 63 68 28 49 64 78 48 61 73 68 20  hSearch(IdxHash 
32030 2a 70 48 61 73 68 2c 20 63 6f 6e 73 74 20 63 68  *pHash, const ch
32040 61 72 20 2a 7a 4b 65 79 2c 20 69 6e 74 20 6e 4b  ar *zKey, int nK
32050 65 79 29 7b 0a 20 20 49 64 78 48 61 73 68 45 6e  ey){.  IdxHashEn
32060 74 72 79 20 2a 70 45 6e 74 72 79 20 3d 20 69 64  try *pEntry = id
32070 78 48 61 73 68 46 69 6e 64 28 70 48 61 73 68 2c  xHashFind(pHash,
32080 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   zKey, nKey);.  
32090 69 66 28 20 70 45 6e 74 72 79 20 29 20 72 65 74  if( pEntry ) ret
320a0 75 72 6e 20 70 45 6e 74 72 79 2d 3e 7a 56 61 6c  urn pEntry->zVal
320b0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
320c0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
320d0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
320e0 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 6f   IdxConstraint o
320f0 62 6a 65 63 74 2e 20 53 65 74 20 74 68 65 20 49  bject. Set the I
32100 64 78 43 6f 6e 73 74 72 61 69 6e 74 2e 7a 43 6f  dxConstraint.zCo
32110 6c 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  ll.** variable t
32120 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 63 6f 70  o point to a cop
32130 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  y of nul-termina
32140 74 65 64 20 73 74 72 69 6e 67 20 7a 43 6f 6c 6c  ted string zColl
32150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 49 64 78 43  ..*/.static IdxC
32160 6f 6e 73 74 72 61 69 6e 74 20 2a 69 64 78 4e 65  onstraint *idxNe
32170 77 43 6f 6e 73 74 72 61 69 6e 74 28 69 6e 74 20  wConstraint(int 
32180 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pRc, const char
32190 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 64 78 43   *zColl){.  IdxC
321a0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 4e 65 77 3b  onstraint *pNew;
321b0 0a 20 20 69 6e 74 20 6e 43 6f 6c 6c 20 3d 20 53  .  int nColl = S
321c0 54 52 4c 45 4e 28 7a 43 6f 6c 6c 29 3b 0a 0a 20  TRLEN(zColl);.. 
321d0 20 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53   assert( *pRc==S
321e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 4e  QLITE_OK );.  pN
321f0 65 77 20 3d 20 28 49 64 78 43 6f 6e 73 74 72 61  ew = (IdxConstra
32200 69 6e 74 2a 29 69 64 78 4d 61 6c 6c 6f 63 28 70  int*)idxMalloc(p
32210 52 63 2c 20 73 69 7a 65 6f 66 28 49 64 78 43 6f  Rc, sizeof(IdxCo
32220 6e 73 74 72 61 69 6e 74 29 20 2a 20 6e 43 6f 6c  nstraint) * nCol
32230 6c 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  l + 1);.  if( pN
32240 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
32250 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29 26  zColl = (char*)&
32260 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pNew[1];.    mem
32270 63 70 79 28 70 4e 65 77 2d 3e 7a 43 6f 6c 6c 2c  cpy(pNew->zColl,
32280 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 2b 31 29   zColl, nColl+1)
32290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
322a0 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  New;.}../*.** An
322b0 20 65 72 72 6f 72 20 61 73 73 6f 63 69 61 74 65   error associate
322c0 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
322d0 68 61 6e 64 6c 65 20 64 62 20 68 61 73 20 6a 75  handle db has ju
322e0 73 74 20 6f 63 63 75 72 72 65 64 2e 20 50 61 73  st occurred. Pas
322f0 73 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 6d  s.** the error m
32300 65 73 73 61 67 65 20 74 6f 20 63 61 6c 6c 62 61  essage to callba
32310 63 6b 20 66 75 6e 63 74 69 6f 6e 20 78 4f 75 74  ck function xOut
32320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32330 20 69 64 78 44 61 74 61 62 61 73 65 45 72 72 6f   idxDatabaseErro
32340 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
32350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32360 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
32370 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 68 61   handle */.  cha
32380 72 20 2a 2a 70 7a 45 72 72 6d 73 67 20 20 20 20  r **pzErrmsg    
32390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
323a0 57 72 69 74 65 20 65 72 72 6f 72 20 68 65 72 65  Write error here
323b0 20 2a 2f 0a 29 7b 0a 20 20 2a 70 7a 45 72 72 6d   */.){.  *pzErrm
323c0 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
323d0 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
323e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
323f0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
32400 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
32410 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
32420 20 69 64 78 50 72 65 70 61 72 65 53 74 6d 74 28   idxPrepareStmt(
32430 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
32440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32450 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
32460 61 6e 64 6c 65 20 74 6f 20 63 6f 6d 70 69 6c 65  andle to compile
32470 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 73 71   against */.  sq
32480 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53  lite3_stmt **ppS
32490 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tmt,          /*
324a0 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64 20 53   OUT: Compiled S
324b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
324c0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73    char **pzErrms
324d0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
324e0 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69 74 65    /* OUT: sqlite
324f0 33 5f 6d 61 6c 6c 6f 63 28 29 65 64 20 65 72 72  3_malloc()ed err
32500 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  or message */.  
32510 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  /* SQL statement
32540 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 29   to compile */.)
32550 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
32560 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
32570 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
32580 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
32590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
325a0 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  .    *ppStmt = 0
325b0 3b 0a 20 20 20 20 69 64 78 44 61 74 61 62 61 73  ;.    idxDatabas
325c0 65 45 72 72 6f 72 28 64 62 2c 20 70 7a 45 72 72  eError(db, pzErr
325d0 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  msg);.  }.  retu
325e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
325f0 50 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73  Prepare an SQL s
32600 74 61 74 65 6d 65 6e 74 20 75 73 69 6e 67 20 74  tatement using t
32610 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 20  he results of a 
32620 70 72 69 6e 74 66 28 29 20 66 6f 72 6d 61 74 74  printf() formatt
32630 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
32640 6e 74 20 69 64 78 50 72 69 6e 74 66 50 72 65 70  nt idxPrintfPrep
32650 61 72 65 53 74 6d 74 28 0a 20 20 73 71 6c 69 74  areStmt(.  sqlit
32660 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
32670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
32680 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f  tabase handle to
32690 20 63 6f 6d 70 69 6c 65 20 61 67 61 69 6e 73 74   compile against
326a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
326b0 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20  mt **ppStmt,    
326c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f        /* OUT: Co
326d0 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61 74 65  mpiled SQL state
326e0 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ment */.  char *
326f0 2a 70 7a 45 72 72 6d 73 67 2c 20 20 20 20 20 20  *pzErrmsg,      
32700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
32710 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  : sqlite3_malloc
32720 28 29 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  ()ed error messa
32730 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ge */.  const ch
32740 61 72 20 2a 7a 46 6d 74 2c 20 20 20 20 20 20 20  ar *zFmt,       
32750 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74          /* print
32760 66 28 29 20 66 6f 72 6d 61 74 20 6f 66 20 53 51  f() format of SQ
32770 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
32780 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20   ...            
32790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327a0 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 70 72 69   /* Trailing pri
327b0 6e 74 66 28 29 20 61 72 67 75 6d 65 6e 74 73 20  ntf() arguments 
327c0 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  */.){.  va_list 
327d0 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ap;.  int rc;.  
327e0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61  char *zSql;.  va
327f0 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
32800 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
32810 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
32820 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  , ap);.  if( zSq
32830 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
32840 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
32850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
32860 20 69 64 78 50 72 65 70 61 72 65 53 74 6d 74 28   idxPrepareStmt(
32870 64 62 2c 20 70 70 53 74 6d 74 2c 20 70 7a 45 72  db, ppStmt, pzEr
32880 72 6d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  rmsg, zSql);.   
32890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
328a0 71 6c 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e  ql);.  }.  va_en
328b0 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
328c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  rc;.}.../*******
328d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
328e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
328f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32910 2a 2a 0a 2a 2a 20 42 65 67 69 6e 6e 69 6e 67 20  **.** Beginning 
32920 6f 66 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  of virtual table
32930 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
32940 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
32950 63 74 20 45 78 70 65 72 74 56 74 61 62 20 45 78  ct ExpertVtab Ex
32960 70 65 72 74 56 74 61 62 3b 0a 73 74 72 75 63 74  pertVtab;.struct
32970 20 45 78 70 65 72 74 56 74 61 62 20 7b 0a 20 20   ExpertVtab {.  
32980 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
32990 65 3b 0a 20 20 49 64 78 54 61 62 6c 65 20 2a 70  e;.  IdxTable *p
329a0 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 65 78  Tab;.  sqlite3ex
329b0 70 65 72 74 20 2a 70 45 78 70 65 72 74 3b 0a 7d  pert *pExpert;.}
329c0 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
329d0 74 20 45 78 70 65 72 74 43 73 72 20 45 78 70 65  t ExpertCsr Expe
329e0 72 74 43 73 72 3b 0a 73 74 72 75 63 74 20 45 78  rtCsr;.struct Ex
329f0 70 65 72 74 43 73 72 20 7b 0a 20 20 73 71 6c 69  pertCsr {.  sqli
32a00 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
32a10 62 61 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  base;.  sqlite3_
32a20 73 74 6d 74 20 2a 70 44 61 74 61 3b 0a 7d 3b 0a  stmt *pData;.};.
32a30 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 78  .static char *ex
32a40 70 65 72 74 44 65 71 75 6f 74 65 28 63 6f 6e 73  pertDequote(cons
32a50 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
32a60 69 6e 74 20 6e 20 3d 20 53 54 52 4c 45 4e 28 7a  int n = STRLEN(z
32a70 49 6e 29 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  In);.  char *zRe
32a80 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
32a90 6f 63 28 6e 29 3b 0a 0a 20 20 61 73 73 65 72 74  oc(n);..  assert
32aa0 28 20 7a 49 6e 5b 30 5d 3d 3d 27 5c 27 27 20 29  ( zIn[0]=='\'' )
32ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 49 6e 5b  ;.  assert( zIn[
32ac0 6e 2d 31 5d 3d 3d 27 5c 27 27 20 29 3b 0a 0a 20  n-1]=='\'' );.. 
32ad0 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
32ae0 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 0a 20   int iOut = 0;. 
32af0 20 20 20 69 6e 74 20 69 49 6e 20 3d 20 30 3b 0a     int iIn = 0;.
32b00 20 20 20 20 66 6f 72 28 69 49 6e 3d 31 3b 20 69      for(iIn=1; i
32b10 49 6e 3c 28 6e 2d 31 29 3b 20 69 49 6e 2b 2b 29  In<(n-1); iIn++)
32b20 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b  {.      if( zIn[
32b30 69 49 6e 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  iIn]=='\'' ){.  
32b40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 49        assert( zI
32b50 6e 5b 69 49 6e 2b 31 5d 3d 3d 27 5c 27 27 20 29  n[iIn+1]=='\'' )
32b60 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b  ;.        iIn++;
32b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
32b80 52 65 74 5b 69 4f 75 74 2b 2b 5d 20 3d 20 7a 49  Ret[iOut++] = zI
32b90 6e 5b 69 49 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20  n[iIn];.    }.  
32ba0 20 20 7a 52 65 74 5b 69 4f 75 74 5d 20 3d 20 27    zRet[iOut] = '
32bb0 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  \0';.  }..  retu
32bc0 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a 20 0a  rn zRet;.}../* .
32bd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
32be0 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
32bf0 74 61 74 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74  tation of both t
32c00 68 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20  he xConnect and 
32c10 78 43 72 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f  xCreate.** metho
32c20 64 73 20 6f 66 20 74 68 65 20 72 2d 74 72 65 65  ds of the r-tree
32c30 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
32c40 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20  **.**   argv[0] 
32c50 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65    -> module name
32c60 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d 20 20 20  .**   argv[1]   
32c70 2d 3e 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  -> database name
32c80 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d 20 20 20  .**   argv[2]   
32c90 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a  -> table name.**
32ca0 20 20 20 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20     argv[...] -> 
32cb0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 2e 2e 0a  column names....
32cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
32cd0 70 65 72 74 43 6f 6e 6e 65 63 74 28 0a 20 20 73  pertConnect(.  s
32ce0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
32cf0 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
32d00 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
32d10 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
32d20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
32d30 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
32d40 70 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74  pzErr.){.  sqlit
32d50 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72  e3expert *pExper
32d60 74 20 3d 20 28 73 71 6c 69 74 65 33 65 78 70 65  t = (sqlite3expe
32d70 72 74 2a 29 70 41 75 78 3b 0a 20 20 45 78 70 65  rt*)pAux;.  Expe
32d80 72 74 56 74 61 62 20 2a 70 20 3d 20 30 3b 0a 20  rtVtab *p = 0;. 
32d90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
32da0 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 2a  argc!=4 ){.    *
32db0 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  pzErr = sqlite3_
32dc0 6d 70 72 69 6e 74 66 28 22 69 6e 74 65 72 6e 61  mprintf("interna
32dd0 6c 20 65 72 72 6f 72 21 22 29 3b 0a 20 20 20 20  l error!");.    
32de0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
32df0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
32e00 63 68 61 72 20 2a 7a 43 72 65 61 74 65 54 61 62  char *zCreateTab
32e10 6c 65 20 3d 20 65 78 70 65 72 74 44 65 71 75 6f  le = expertDequo
32e20 74 65 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 20  te(argv[3]);.   
32e30 20 69 66 28 20 7a 43 72 65 61 74 65 54 61 62 6c   if( zCreateTabl
32e40 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
32e50 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
32e60 76 74 61 62 28 64 62 2c 20 7a 43 72 65 61 74 65  vtab(db, zCreate
32e70 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  Table);.      if
32e80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32e90 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 69  ){.        p = i
32ea0 64 78 4d 61 6c 6c 6f 63 28 26 72 63 2c 20 73 69  dxMalloc(&rc, si
32eb0 7a 65 6f 66 28 45 78 70 65 72 74 56 74 61 62 29  zeof(ExpertVtab)
32ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32ed0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32ee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  OK ){.        p-
32ef0 3e 70 45 78 70 65 72 74 20 3d 20 70 45 78 70 65  >pExpert = pExpe
32f00 72 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  rt;.        p->p
32f10 54 61 62 20 3d 20 70 45 78 70 65 72 74 2d 3e 70  Tab = pExpert->p
32f20 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 61  Table;.        a
32f30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 73  ssert( sqlite3_s
32f40 74 72 69 63 6d 70 28 70 2d 3e 70 54 61 62 2d 3e  tricmp(p->pTab->
32f50 7a 4e 61 6d 65 2c 20 61 72 67 76 5b 32 5d 29 3d  zName, argv[2])=
32f60 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  =0 );.      }.  
32f70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32f80 28 7a 43 72 65 61 74 65 54 61 62 6c 65 29 3b 0a  (zCreateTable);.
32f90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32fa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
32fb0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  EM;.    }.  }.. 
32fc0 20 2a 70 70 56 74 61 62 20 3d 20 28 73 71 6c 69   *ppVtab = (sqli
32fd0 74 65 33 5f 76 74 61 62 2a 29 70 3b 0a 20 20 72  te3_vtab*)p;.  r
32fe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
32ff0 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 44 69  tic int expertDi
33000 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33  sconnect(sqlite3
33010 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
33020 20 45 78 70 65 72 74 56 74 61 62 20 2a 70 20 3d   ExpertVtab *p =
33030 20 28 45 78 70 65 72 74 56 74 61 62 2a 29 70 56   (ExpertVtab*)pV
33040 74 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  tab;.  sqlite3_f
33050 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
33060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
33070 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
33080 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74 65  BestIndex(sqlite
33090 33 5f 76 74 61 62 20 2a 70 56 74 61 62 2c 20 73  3_vtab *pVtab, s
330a0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
330b0 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20  o *pIdxInfo){.  
330c0 45 78 70 65 72 74 56 74 61 62 20 2a 70 20 3d 20  ExpertVtab *p = 
330d0 28 45 78 70 65 72 74 56 74 61 62 2a 29 70 56 74  (ExpertVtab*)pVt
330e0 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ab;.  int rc = S
330f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
33100 6e 20 3d 20 30 3b 0a 20 20 49 64 78 53 63 61 6e  n = 0;.  IdxScan
33110 20 2a 70 53 63 61 6e 3b 0a 20 20 63 6f 6e 73 74   *pScan;.  const
33120 20 69 6e 74 20 6f 70 6d 61 73 6b 20 3d 20 0a 20   int opmask = . 
33130 20 20 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f     SQLITE_INDEX_
33140 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 7c 20  CONSTRAINT_EQ | 
33150 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
33160 53 54 52 41 49 4e 54 5f 47 54 20 7c 0a 20 20 20  STRAINT_GT |.   
33170 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
33180 4e 53 54 52 41 49 4e 54 5f 4c 54 20 7c 20 53 51  NSTRAINT_LT | SQ
33190 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
331a0 52 41 49 4e 54 5f 47 45 20 7c 0a 20 20 20 20 53  RAINT_GE |.    S
331b0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
331c0 54 52 41 49 4e 54 5f 4c 45 3b 0a 0a 20 20 70 53  TRAINT_LE;..  pS
331d0 63 61 6e 20 3d 20 69 64 78 4d 61 6c 6c 6f 63 28  can = idxMalloc(
331e0 26 72 63 2c 20 73 69 7a 65 6f 66 28 49 64 78 53  &rc, sizeof(IdxS
331f0 63 61 6e 29 29 3b 0a 20 20 69 66 28 20 70 53 63  can));.  if( pSc
33200 61 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  an ){.    int i;
33210 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
33220 65 20 6e 65 77 20 73 63 61 6e 20 6f 62 6a 65 63  e new scan objec
33230 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  t into the list 
33240 2a 2f 0a 20 20 20 20 70 53 63 61 6e 2d 3e 70 54  */.    pScan->pT
33250 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20  ab = p->pTab;.  
33260 20 20 70 53 63 61 6e 2d 3e 70 4e 65 78 74 53 63    pScan->pNextSc
33270 61 6e 20 3d 20 70 2d 3e 70 45 78 70 65 72 74 2d  an = p->pExpert-
33280 3e 70 53 63 61 6e 3b 0a 20 20 20 20 70 2d 3e 70  >pScan;.    p->p
33290 45 78 70 65 72 74 2d 3e 70 53 63 61 6e 20 3d 20  Expert->pScan = 
332a0 70 53 63 61 6e 3b 0a 0a 20 20 20 20 2f 2a 20 41  pScan;..    /* A
332b0 64 64 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  dd the constrain
332c0 74 73 20 74 6f 20 74 68 65 20 49 64 78 53 63 61  ts to the IdxSca
332d0 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  n object */.    
332e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
332f0 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
33300 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
33310 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
33320 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
33330 43 6f 6e 73 20 3d 20 26 70 49 64 78 49 6e 66 6f  Cons = &pIdxInfo
33340 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
33350 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
33360 73 2d 3e 75 73 61 62 6c 65 20 0a 20 20 20 20 20  s->usable .     
33370 20 20 26 26 20 70 43 6f 6e 73 2d 3e 69 43 6f 6c    && pCons->iCol
33380 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20 20 26  umn>=0 .       &
33390 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b  & p->pTab->aCol[
333a0 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e  pCons->iColumn].
333b0 69 50 6b 3d 3d 30 0a 20 20 20 20 20 20 20 26 26  iPk==0.       &&
333c0 20 28 70 43 6f 6e 73 2d 3e 6f 70 20 26 20 6f 70   (pCons->op & op
333d0 6d 61 73 6b 29 20 0a 20 20 20 20 20 20 29 7b 0a  mask) .      ){.
333e0 20 20 20 20 20 20 20 20 49 64 78 43 6f 6e 73 74          IdxConst
333f0 72 61 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 20  raint *pNew;.   
33400 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
33410 2a 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *zColl = sqlite3
33420 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28  _vtab_collation(
33430 70 49 64 78 49 6e 66 6f 2c 20 69 29 3b 0a 20 20  pIdxInfo, i);.  
33440 20 20 20 20 20 20 70 4e 65 77 20 3d 20 69 64 78        pNew = idx
33450 4e 65 77 43 6f 6e 73 74 72 61 69 6e 74 28 26 72  NewConstraint(&r
33460 63 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  c, zColl);.     
33470 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
33480 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
33490 43 6f 6c 20 3d 20 70 43 6f 6e 73 2d 3e 69 43 6f  Col = pCons->iCo
334a0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
334b0 69 66 28 20 70 43 6f 6e 73 2d 3e 6f 70 3d 3d 53  if( pCons->op==S
334c0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
334d0 54 52 41 49 4e 54 5f 45 51 20 29 7b 0a 20 20 20  TRAINT_EQ ){.   
334e0 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
334f0 4e 65 78 74 20 3d 20 70 53 63 61 6e 2d 3e 70 45  Next = pScan->pE
33500 71 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  q;.            p
33510 53 63 61 6e 2d 3e 70 45 71 20 3d 20 70 4e 65 77  Scan->pEq = pNew
33520 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
33530 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
33540 4e 65 77 2d 3e 62 52 61 6e 67 65 20 3d 20 31 3b  New->bRange = 1;
33550 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
33560 77 2d 3e 70 4e 65 78 74 20 3d 20 70 53 63 61 6e  w->pNext = pScan
33570 2d 3e 70 52 61 6e 67 65 3b 0a 20 20 20 20 20 20  ->pRange;.      
33580 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 52 61        pScan->pRa
33590 6e 67 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  nge = pNew;.    
335a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
335b0 7d 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  }.        n++;. 
335c0 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
335d0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
335e0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  e[i].argvIndex =
335f0 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
33600 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
33610 65 20 4f 52 44 45 52 20 42 59 20 74 6f 20 74 68  e ORDER BY to th
33620 65 20 49 64 78 53 63 61 6e 20 6f 62 6a 65 63 74  e IdxScan object
33630 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 70 49   */.    for(i=pI
33640 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
33650 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
33660 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
33670 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65   pIdxInfo->aOrde
33680 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 3b 0a  rBy[i].iColumn;.
33690 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
336a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 64 78  0 ){.        Idx
336b0 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 4e 65 77  Constraint *pNew
336c0 20 3d 20 69 64 78 4e 65 77 43 6f 6e 73 74 72 61   = idxNewConstra
336d0 69 6e 74 28 26 72 63 2c 20 70 2d 3e 70 54 61 62  int(&rc, p->pTab
336e0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 43 6f  ->aCol[iCol].zCo
336f0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
33700 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
33710 20 20 20 70 4e 65 77 2d 3e 69 43 6f 6c 20 3d 20     pNew->iCol = 
33720 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  iCol;.          
33730 70 4e 65 77 2d 3e 62 44 65 73 63 20 3d 20 70 49  pNew->bDesc = pI
33740 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
33750 5b 69 5d 2e 64 65 73 63 3b 0a 20 20 20 20 20 20  [i].desc;.      
33760 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
33770 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 64 65 72 3b  = pScan->pOrder;
33780 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
33790 3e 70 4c 69 6e 6b 20 3d 20 70 53 63 61 6e 2d 3e  >pLink = pScan->
337a0 70 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20  pOrder;.        
337b0 20 20 70 53 63 61 6e 2d 3e 70 4f 72 64 65 72 20    pScan->pOrder 
337c0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
337d0 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    n++;.        }
337e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
337f0 20 7d 0a 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   }..  pIdxInfo->
33800 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
33810 31 30 30 30 30 30 30 2e 30 20 2f 20 28 6e 2b 31  1000000.0 / (n+1
33820 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
33830 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  }..static int ex
33840 70 65 72 74 55 70 64 61 74 65 28 0a 20 20 73 71  pertUpdate(.  sq
33850 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
33860 62 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c  b, .  int nData,
33870 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
33880 65 20 2a 2a 61 7a 44 61 74 61 2c 20 0a 20 20 73  e **azData, .  s
33890 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
338a0 77 69 64 0a 29 7b 0a 20 20 28 76 6f 69 64 29 70  wid.){.  (void)p
338b0 56 74 61 62 3b 0a 20 20 28 76 6f 69 64 29 6e 44  Vtab;.  (void)nD
338c0 61 74 61 3b 0a 20 20 28 76 6f 69 64 29 61 7a 44  ata;.  (void)azD
338d0 61 74 61 3b 0a 20 20 28 76 6f 69 64 29 70 52 6f  ata;.  (void)pRo
338e0 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  wid;.  return SQ
338f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
33900 2a 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65  ** Virtual table
33910 20 6d 6f 64 75 6c 65 20 78 4f 70 65 6e 20 6d 65   module xOpen me
33920 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
33930 69 6e 74 20 65 78 70 65 72 74 4f 70 65 6e 28 73  int expertOpen(s
33940 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
33950 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ab, sqlite3_vtab
33960 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
33970 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  or){.  int rc = 
33980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 45 78 70  SQLITE_OK;.  Exp
33990 65 72 74 43 73 72 20 2a 70 43 73 72 3b 0a 20 20  ertCsr *pCsr;.  
339a0 28 76 6f 69 64 29 70 56 54 61 62 3b 0a 20 20 70  (void)pVTab;.  p
339b0 43 73 72 20 3d 20 69 64 78 4d 61 6c 6c 6f 63 28  Csr = idxMalloc(
339c0 26 72 63 2c 20 73 69 7a 65 6f 66 28 45 78 70 65  &rc, sizeof(Expe
339d0 72 74 43 73 72 29 29 3b 0a 20 20 2a 70 70 43 75  rtCsr));.  *ppCu
339e0 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  rsor = (sqlite3_
339f0 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 70 43 73  vtab_cursor*)pCs
33a00 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  r;.  return rc;.
33a10 7d 0a 0a 2f 2a 20 0a 2a 2a 20 56 69 72 74 75 61  }../* .** Virtua
33a20 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 78  l table module x
33a30 43 6c 6f 73 65 20 6d 65 74 68 6f 64 2e 0a 2a 2f  Close method..*/
33a40 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65  .static int expe
33a50 72 74 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  rtClose(sqlite3_
33a60 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
33a70 29 7b 0a 20 20 45 78 70 65 72 74 43 73 72 20 2a  ){.  ExpertCsr *
33a80 70 43 73 72 20 3d 20 28 45 78 70 65 72 74 43 73  pCsr = (ExpertCs
33a90 72 2a 29 63 75 72 3b 0a 20 20 73 71 6c 69 74 65  r*)cur;.  sqlite
33aa0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d  3_finalize(pCsr-
33ab0 3e 70 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >pData);.  sqlit
33ac0 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20  e3_free(pCsr);. 
33ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
33ae0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 69 72 74  K;.}../*.** Virt
33af0 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
33b00 20 78 45 6f 66 20 6d 65 74 68 6f 64 2e 0a 2a 2a   xEof method..**
33b10 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** Return non-z
33b20 65 72 6f 20 69 66 20 74 68 65 20 63 75 72 73 6f  ero if the curso
33b30 72 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65  r does not curre
33b40 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20 61 20  ntly point to a 
33b50 76 61 6c 69 64 20 0a 2a 2a 20 72 65 63 6f 72 64  valid .** record
33b60 20 28 69 2e 65 20 69 66 20 74 68 65 20 73 63 61   (i.e if the sca
33b70 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64 29 2c  n has finished),
33b80 20 6f 72 20 7a 65 72 6f 20 6f 74 68 65 72 77 69   or zero otherwi
33b90 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
33ba0 74 20 65 78 70 65 72 74 45 6f 66 28 73 71 6c 69  t expertEof(sqli
33bb0 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
33bc0 2a 63 75 72 29 7b 0a 20 20 45 78 70 65 72 74 43  *cur){.  ExpertC
33bd0 73 72 20 2a 70 43 73 72 20 3d 20 28 45 78 70 65  sr *pCsr = (Expe
33be0 72 74 43 73 72 2a 29 63 75 72 3b 0a 20 20 72 65  rtCsr*)cur;.  re
33bf0 74 75 72 6e 20 70 43 73 72 2d 3e 70 44 61 74 61  turn pCsr->pData
33c00 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 56  ==0;.}../* .** V
33c10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
33c20 75 6c 65 20 78 4e 65 78 74 20 6d 65 74 68 6f 64  ule xNext method
33c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c40 65 78 70 65 72 74 4e 65 78 74 28 73 71 6c 69 74  expertNext(sqlit
33c50 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
33c60 63 75 72 29 7b 0a 20 20 45 78 70 65 72 74 43 73  cur){.  ExpertCs
33c70 72 20 2a 70 43 73 72 20 3d 20 28 45 78 70 65 72  r *pCsr = (Exper
33c80 74 43 73 72 2a 29 63 75 72 3b 0a 20 20 69 6e 74  tCsr*)cur;.  int
33c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
33cb0 2d 3e 70 44 61 74 61 20 29 3b 0a 20 20 72 63 20  ->pData );.  rc 
33cc0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
33cd0 43 73 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 69  Csr->pData);.  i
33ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  f( rc!=SQLITE_RO
33cf0 57 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  W ){.    rc = sq
33d00 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
33d10 43 73 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  Csr->pData);.   
33d20 20 70 43 73 72 2d 3e 70 44 61 74 61 20 3d 20 30   pCsr->pData = 0
33d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
33d40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
33d50 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
33d60 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 56 69 72 74 75  .}../* .** Virtu
33d70 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
33d80 78 52 6f 77 69 64 20 6d 65 74 68 6f 64 2e 0a 2a  xRowid method..*
33d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
33da0 65 72 74 52 6f 77 69 64 28 73 71 6c 69 74 65 33  ertRowid(sqlite3
33db0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
33dc0 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
33dd0 2a 70 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69  *pRowid){.  (voi
33de0 64 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64  d)cur;.  *pRowid
33df0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
33e00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
33e10 0a 2a 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c  .** Virtual tabl
33e20 65 20 6d 6f 64 75 6c 65 20 78 43 6f 6c 75 6d 6e  e module xColumn
33e30 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
33e40 69 63 20 69 6e 74 20 65 78 70 65 72 74 43 6f 6c  ic int expertCol
33e50 75 6d 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  umn(sqlite3_vtab
33e60 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
33e70 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
33e80 74 78 2c 20 69 6e 74 20 69 29 7b 0a 20 20 45 78  tx, int i){.  Ex
33e90 70 65 72 74 43 73 72 20 2a 70 43 73 72 20 3d 20  pertCsr *pCsr = 
33ea0 28 45 78 70 65 72 74 43 73 72 2a 29 63 75 72 3b  (ExpertCsr*)cur;
33eb0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
33ec0 20 2a 70 56 61 6c 3b 0a 20 20 70 56 61 6c 20 3d   *pVal;.  pVal =
33ed0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
33ee0 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 44 61 74  value(pCsr->pDat
33ef0 61 2c 20 69 29 3b 0a 20 20 69 66 28 20 70 56 61  a, i);.  if( pVa
33f00 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
33f10 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
33f20 78 2c 20 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  x, pVal);.  }.  
33f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33f40 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 56 69 72 74  ;.}../* .** Virt
33f50 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65  ual table module
33f60 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 2e   xFilter method.
33f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
33f80 78 70 65 72 74 46 69 6c 74 65 72 28 0a 20 20 73  xpertFilter(.  s
33f90 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
33fa0 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e 74 20  or *cur, .  int 
33fb0 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  idxNum, const ch
33fc0 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e  ar *idxStr,.  in
33fd0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
33fe0 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
33ff0 20 20 45 78 70 65 72 74 43 73 72 20 2a 70 43 73    ExpertCsr *pCs
34000 72 20 3d 20 28 45 78 70 65 72 74 43 73 72 2a 29  r = (ExpertCsr*)
34010 63 75 72 3b 0a 20 20 45 78 70 65 72 74 56 74 61  cur;.  ExpertVta
34020 62 20 2a 70 56 74 61 62 20 3d 20 28 45 78 70 65  b *pVtab = (Expe
34030 72 74 56 74 61 62 2a 29 28 63 75 72 2d 3e 70 56  rtVtab*)(cur->pV
34040 74 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 65  tab);.  sqlite3e
34050 78 70 65 72 74 20 2a 70 45 78 70 65 72 74 20 3d  xpert *pExpert =
34060 20 70 56 74 61 62 2d 3e 70 45 78 70 65 72 74 3b   pVtab->pExpert;
34070 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 28 76  .  int rc;..  (v
34080 6f 69 64 29 69 64 78 4e 75 6d 3b 0a 20 20 28 76  oid)idxNum;.  (v
34090 6f 69 64 29 69 64 78 53 74 72 3b 0a 20 20 28 76  oid)idxStr;.  (v
340a0 6f 69 64 29 61 72 67 63 3b 0a 20 20 28 76 6f 69  oid)argc;.  (voi
340b0 64 29 61 72 67 76 3b 0a 20 20 72 63 20 3d 20 73  d)argv;.  rc = s
340c0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
340d0 70 43 73 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pCsr->pData);.  
340e0 70 43 73 72 2d 3e 70 44 61 74 61 20 3d 20 30 3b  pCsr->pData = 0;
340f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
34100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
34110 20 69 64 78 50 72 69 6e 74 66 50 72 65 70 61 72   idxPrintfPrepar
34120 65 53 74 6d 74 28 70 45 78 70 65 72 74 2d 3e 64  eStmt(pExpert->d
34130 62 2c 20 26 70 43 73 72 2d 3e 70 44 61 74 61 2c  b, &pCsr->pData,
34140 20 26 70 56 74 61 62 2d 3e 62 61 73 65 2e 7a 45   &pVtab->base.zE
34150 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 22  rrMsg,.        "
34160 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
34170 69 6e 2e 25 51 20 57 48 45 52 45 20 73 61 6d 70  in.%Q WHERE samp
34180 6c 65 28 29 22 2c 20 70 56 74 61 62 2d 3e 70 54  le()", pVtab->pT
34190 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ab->zName.    );
341a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
341b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
341c0 20 72 63 20 3d 20 65 78 70 65 72 74 4e 65 78 74   rc = expertNext
341d0 28 63 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cur);.  }.  ret
341e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
341f0 63 20 69 6e 74 20 69 64 78 52 65 67 69 73 74 65  c int idxRegiste
34200 72 56 74 61 62 28 73 71 6c 69 74 65 33 65 78 70  rVtab(sqlite3exp
34210 65 72 74 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ert *p){.  stati
34220 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
34230 20 65 78 70 65 72 74 4d 6f 64 75 6c 65 20 3d 20   expertModule = 
34240 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20  {.    2,        
34250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34260 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
34270 2a 2f 0a 20 20 20 20 65 78 70 65 72 74 43 6f 6e  */.    expertCon
34280 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
34290 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20       /* xCreate 
342a0 2d 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65  - create a table
342b0 20 2a 2f 0a 20 20 20 20 65 78 70 65 72 74 43 6f   */.    expertCo
342c0 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
342d0 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63        /* xConnec
342e0 74 20 2d 20 63 6f 6e 6e 65 63 74 20 74 6f 20 61  t - connect to a
342f0 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65  n existing table
34300 20 2a 2f 0a 20 20 20 20 65 78 70 65 72 74 42 65   */.    expertBe
34310 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  stIndex,        
34320 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
34330 64 65 78 20 2d 20 44 65 74 65 72 6d 69 6e 65 20  dex - Determine 
34340 73 65 61 72 63 68 20 73 74 72 61 74 65 67 79 20  search strategy 
34350 2a 2f 0a 20 20 20 20 65 78 70 65 72 74 44 69 73  */.    expertDis
34360 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  connect,        
34370 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
34380 65 63 74 20 2d 20 44 69 73 63 6f 6e 6e 65 63 74  ect - Disconnect
34390 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 2a 2f   from a table */
343a0 0a 20 20 20 20 65 78 70 65 72 74 44 69 73 63 6f  .    expertDisco
343b0 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
343c0 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d     /* xDestroy -
343d0 20 44 72 6f 70 20 61 20 74 61 62 6c 65 20 2a 2f   Drop a table */
343e0 0a 20 20 20 20 65 78 70 65 72 74 4f 70 65 6e 2c  .    expertOpen,
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
34410 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
34420 20 20 20 65 78 70 65 72 74 43 6c 6f 73 65 2c 20     expertClose, 
34430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34440 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
34450 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
34460 20 20 20 65 78 70 65 72 74 46 69 6c 74 65 72 2c     expertFilter,
34470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34480 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
34490 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
344a0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20  straints */.    
344b0 65 78 70 65 72 74 4e 65 78 74 2c 20 20 20 20 20  expertNext,     
344c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
344d0 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65   xNext - advance
344e0 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20   a cursor */.   
344f0 20 65 78 70 65 72 74 45 6f 66 2c 20 20 20 20 20   expertEof,     
34500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34510 2a 20 78 45 6f 66 20 2a 2f 0a 20 20 20 20 65 78  * xEof */.    ex
34520 70 65 72 74 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  pertColumn,     
34530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
34540 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61  Column - read da
34550 74 61 20 2a 2f 0a 20 20 20 20 65 78 70 65 72 74  ta */.    expert
34560 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
34570 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
34580 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
34590 0a 20 20 20 20 65 78 70 65 72 74 55 70 64 61 74  .    expertUpdat
345a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
345b0 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2d 20     /* xUpdate - 
345c0 77 72 69 74 65 20 64 61 74 61 20 2a 2f 0a 20 20  write data */.  
345d0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345f0 2f 2a 20 78 42 65 67 69 6e 20 2d 20 62 65 67 69  /* xBegin - begi
34600 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  n transaction */
34610 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
34620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34630 20 20 20 2f 2a 20 78 53 79 6e 63 20 2d 20 73 79     /* xSync - sy
34640 6e 63 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  nc transaction *
34650 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
34660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34670 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2d      /* xCommit -
34680 20 63 6f 6d 6d 69 74 20 74 72 61 6e 73 61 63 74   commit transact
34690 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ion */.    0,   
346a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
346c0 6c 62 61 63 6b 20 2d 20 72 6f 6c 6c 62 61 63 6b  lback - rollback
346d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
346e0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
346f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34700 20 20 2f 2a 20 78 46 69 6e 64 46 75 6e 63 74 69    /* xFindFuncti
34710 6f 6e 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6f 76  on - function ov
34720 65 72 6c 6f 61 64 69 6e 67 20 2a 2f 0a 20 20 20  erloading */.   
34730 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34750 2a 20 78 52 65 6e 61 6d 65 20 2d 20 72 65 6e 61  * xRename - rena
34760 6d 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  me the table */.
34770 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
34780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34790 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
347a0 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
347b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347c0 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65       /* xRelease
347d0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
347e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347f0 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
34800 63 6b 54 6f 20 2a 2f 0a 20 20 20 20 30 2c 20 20  ckTo */.    0,  
34810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
34830 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 20 20 7d 3b  adowName */.  };
34840 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
34850 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65  e3_create_module
34860 28 70 2d 3e 64 62 76 2c 20 22 65 78 70 65 72 74  (p->dbv, "expert
34870 22 2c 20 26 65 78 70 65 72 74 4d 6f 64 75 6c 65  ", &expertModule
34880 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 7d 0a 2f  , (void*)p);.}./
34890 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 76 69 72 74  *.** End of virt
348a0 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d  ual table implem
348b0 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 2a 2a 2a 2a  entation..******
348c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
348d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
348e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
348f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34900 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 46 69 6e 61 6c  ***/./*.** Final
34910 69 7a 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ize SQL statemen
34920 74 20 70 53 74 6d 74 2e 20 49 66 20 28 2a 70 52  t pStmt. If (*pR
34930 63 29 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  c) is SQLITE_OK 
34940 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
34950 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  on.** is called,
34960 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 72   set it to the r
34970 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
34980 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
34990 29 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  ) before.** retu
349a0 72 6e 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  rning. Otherwise
349b0 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 73 71  , discard the sq
349c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 29  lite3_finalize()
349d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a   return value..*
349e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
349f0 78 46 69 6e 61 6c 69 7a 65 28 69 6e 74 20 2a 70  xFinalize(int *p
34a00 52 63 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  Rc, sqlite3_stmt
34a10 20 2a 70 53 74 6d 74 29 7b 0a 20 20 69 6e 74 20   *pStmt){.  int 
34a20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
34a30 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
34a40 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
34a50 5f 4f 4b 20 29 20 2a 70 52 63 20 3d 20 72 63 3b  _OK ) *pRc = rc;
34a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
34a70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
34a80 20 49 64 78 54 61 62 6c 65 20 73 74 72 75 63 74   IdxTable struct
34a90 75 72 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ure correspondin
34aa0 67 20 74 6f 20 74 61 62 6c 65 20 7a 54 61 62 0a  g to table zTab.
34ab0 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  ** in the main d
34ac0 61 74 61 62 61 73 65 20 6f 66 20 63 6f 6e 6e 65  atabase of conne
34ad0 63 74 69 6f 6e 20 64 62 2e 20 49 66 20 73 75 63  ction db. If suc
34ae0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 28 2a 70  cessful, set (*p
34af0 70 4f 75 74 29 20 74 6f 0a 2a 2a 20 70 6f 69 6e  pOut) to.** poin
34b00 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
34b10 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
34b20 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
34b30 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 0a 2a  ise, return an.*
34b40 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
34b50 6f 64 65 20 61 6e 64 20 73 65 74 20 28 2a 70 70  ode and set (*pp
34b60 4f 75 74 29 20 74 6f 20 4e 55 4c 4c 2e 20 49 6e  Out) to NULL. In
34b70 20 74 68 69 73 20 63 61 73 65 20 2a 70 7a 45 72   this case *pzEr
34b80 72 6d 73 67 20 6d 61 79 20 62 65 0a 2a 2a 20 73  rmsg may be.** s
34b90 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
34ba0 6e 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a  n error string..
34bb0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
34bc0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
34bd0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
34be0 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
34bf0 65 69 74 68 65 72 20 74 68 65 0a 2a 2a 20 49 64  either the.** Id
34c00 78 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 6f 72  xTable object or
34c10 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 75   error message u
34c20 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  sing sqlite3_fre
34c30 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
34c40 6e 74 20 69 64 78 47 65 74 54 61 62 6c 65 49 6e  nt idxGetTableIn
34c50 66 6f 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo(.  sqlite3 *d
34c60 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
34c70 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
34c80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
34c90 72 65 61 64 20 64 65 74 61 69 6c 73 20 66 72 6f  read details fro
34ca0 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  m */.  const cha
34cb0 72 20 2a 7a 54 61 62 2c 20 20 20 20 20 20 20 20  r *zTab,        
34cc0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
34cd0 6e 61 6d 65 20 2a 2f 0a 20 20 49 64 78 54 61 62  name */.  IdxTab
34ce0 6c 65 20 2a 2a 70 70 4f 75 74 2c 20 20 20 20 20  le **ppOut,     
34cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
34d00 3a 20 4e 65 77 20 6f 62 6a 65 63 74 20 28 69 66  : New object (if
34d10 20 73 75 63 63 65 73 73 66 75 6c 29 20 2a 2f 0a   successful) */.
34d20 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73    char **pzErrms
34d30 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
34d40 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
34d50 6d 65 73 73 61 67 65 20 28 69 66 20 6e 6f 74 29  message (if not)
34d60 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
34d70 5f 73 74 6d 74 20 2a 70 31 20 3d 20 30 3b 0a 20  _stmt *p1 = 0;. 
34d80 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
34d90 20 69 6e 74 20 6e 54 61 62 20 3d 20 53 54 52 4c   int nTab = STRL
34da0 45 4e 28 7a 54 61 62 29 3b 0a 20 20 69 6e 74 20  EN(zTab);.  int 
34db0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49  nByte = sizeof(I
34dc0 64 78 54 61 62 6c 65 29 20 2b 20 6e 54 61 62 20  dxTable) + nTab 
34dd0 2b 20 31 3b 0a 20 20 49 64 78 54 61 62 6c 65 20  + 1;.  IdxTable 
34de0 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74  *pNew = 0;.  int
34df0 20 72 63 2c 20 72 63 32 3b 0a 20 20 63 68 61 72   rc, rc2;.  char
34e00 20 2a 70 43 73 72 20 3d 20 30 3b 0a 0a 20 20 72   *pCsr = 0;..  r
34e10 63 20 3d 20 69 64 78 50 72 69 6e 74 66 50 72 65  c = idxPrintfPre
34e20 70 61 72 65 53 74 6d 74 28 64 62 2c 20 26 70 31  pareStmt(db, &p1
34e30 2c 20 70 7a 45 72 72 6d 73 67 2c 20 22 50 52 41  , pzErrmsg, "PRA
34e40 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  GMA table_info=%
34e50 51 22 2c 20 7a 54 61 62 29 3b 0a 20 20 77 68 69  Q", zTab);.  whi
34e60 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
34e70 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
34e80 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 31  =sqlite3_step(p1
34e90 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ) ){.    const c
34ea0 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e  har *zCol = (con
34eb0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
34ec0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 31 2c  _column_text(p1,
34ed0 20 31 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b   1);.    nByte +
34ee0 3d 20 31 20 2b 20 53 54 52 4c 45 4e 28 7a 43 6f  = 1 + STRLEN(zCo
34ef0 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l);.    rc = sql
34f00 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
34f10 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
34f20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
34f30 7a 54 61 62 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26  zTab, zCol, 0, &
34f40 7a 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20  zCol, 0, 0, 0.  
34f50 20 20 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b    );.    nByte +
34f60 3d 20 31 20 2b 20 53 54 52 4c 45 4e 28 7a 43 6f  = 1 + STRLEN(zCo
34f70 6c 29 3b 0a 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a  l);.    nCol++;.
34f80 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69    }.  rc2 = sqli
34f90 74 65 33 5f 72 65 73 65 74 28 70 31 29 3b 0a 20  te3_reset(p1);. 
34fa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34fb0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a  OK ) rc = rc2;..
34fc0 20 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f    nByte += sizeo
34fd0 66 28 49 64 78 43 6f 6c 75 6d 6e 29 20 2a 20 6e  f(IdxColumn) * n
34fe0 43 6f 6c 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Col;.  if( rc==S
34ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35000 70 4e 65 77 20 3d 20 69 64 78 4d 61 6c 6c 6f 63  pNew = idxMalloc
35010 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  (&rc, nByte);.  
35020 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
35030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
35040 77 2d 3e 61 43 6f 6c 20 3d 20 28 49 64 78 43 6f  w->aCol = (IdxCo
35050 6c 75 6d 6e 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  lumn*)&pNew[1];.
35060 20 20 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d      pNew->nCol =
35070 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 43 73 72 20   nCol;.    pCsr 
35080 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 2d 3e  = (char*)&pNew->
35090 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a  aCol[nCol];.  }.
350a0 0a 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 77  .  nCol = 0;.  w
350b0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
350c0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
350d0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
350e0 70 31 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  p1) ){.    const
350f0 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63   char *zCol = (c
35100 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
35110 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
35120 31 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e  1, 1);.    int n
35130 43 6f 70 79 20 3d 20 53 54 52 4c 45 4e 28 7a 43  Copy = STRLEN(zC
35140 6f 6c 29 20 2b 20 31 3b 0a 20 20 20 20 70 4e 65  ol) + 1;.    pNe
35150 77 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 2e 7a 4e  w->aCol[nCol].zN
35160 61 6d 65 20 3d 20 70 43 73 72 3b 0a 20 20 20 20  ame = pCsr;.    
35170 70 4e 65 77 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  pNew->aCol[nCol]
35180 2e 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63  .iPk = sqlite3_c
35190 6f 6c 75 6d 6e 5f 69 6e 74 28 70 31 2c 20 35 29  olumn_int(p1, 5)
351a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 73  ;.    memcpy(pCs
351b0 72 2c 20 7a 43 6f 6c 2c 20 6e 43 6f 70 79 29 3b  r, zCol, nCopy);
351c0 0a 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 43 6f  .    pCsr += nCo
351d0 70 79 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  py;..    rc = sq
351e0 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
351f0 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20  mn_metadata(.   
35200 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c       db, "main",
35210 20 7a 54 61 62 2c 20 7a 43 6f 6c 2c 20 30 2c 20   zTab, zCol, 0, 
35220 26 7a 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 0a 20  &zCol, 0, 0, 0. 
35230 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
35240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35250 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 53 54 52       nCopy = STR
35260 4c 45 4e 28 7a 43 6f 6c 29 20 2b 20 31 3b 0a 20  LEN(zCol) + 1;. 
35270 20 20 20 20 20 70 4e 65 77 2d 3e 61 43 6f 6c 5b       pNew->aCol[
35280 6e 43 6f 6c 5d 2e 7a 43 6f 6c 6c 20 3d 20 70 43  nCol].zColl = pC
35290 73 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  sr;.      memcpy
352a0 28 70 43 73 72 2c 20 7a 43 6f 6c 2c 20 6e 43 6f  (pCsr, zCol, nCo
352b0 70 79 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20  py);.      pCsr 
352c0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
352d0 0a 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 7d  .    nCol++;.  }
352e0 0a 20 20 69 64 78 46 69 6e 61 6c 69 7a 65 28 26  .  idxFinalize(&
352f0 72 63 2c 20 70 31 29 3b 0a 0a 20 20 69 66 28 20  rc, p1);..  if( 
35300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35310 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
35320 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 70 4e 65  e(pNew);.    pNe
35330 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
35340 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20      pNew->zName 
35350 3d 20 70 43 73 72 3b 0a 20 20 20 20 6d 65 6d 63  = pCsr;.    memc
35360 70 79 28 70 4e 65 77 2d 3e 7a 4e 61 6d 65 2c 20  py(pNew->zName, 
35370 7a 54 61 62 2c 20 6e 54 61 62 2b 31 29 3b 0a 20  zTab, nTab+1);. 
35380 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70   }..  *ppOut = p
35390 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  New;.  return rc
353a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
353b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
353c0 2d 6f 70 20 69 66 20 2a 70 52 63 20 69 73 20 73  -op if *pRc is s
353d0 65 74 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 6f  et to anything o
353e0 74 68 65 72 20 74 68 61 6e 20 0a 2a 2a 20 53 51  ther than .** SQ
353f0 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20  LITE_OK when it 
35400 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
35410 20 49 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74   If *pRc is init
35420 69 61 6c 6c 79 20 73 65 74 20 74 6f 20 53 51 4c  ially set to SQL
35430 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 65  ITE_OK, then the
35440 20 74 65 78 74 20 73 70 65 63 69 66 69 65 64 20   text specified 
35450 62 79 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74 66  by.** the printf
35460 28 29 20 73 74 79 6c 65 20 61 72 67 75 6d 65 6e  () style argumen
35470 74 73 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  ts is appended t
35480 6f 20 7a 49 6e 20 61 6e 64 20 74 68 65 20 72 65  o zIn and the re
35490 73 75 6c 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  sult returned.**
354a0 20 69 6e 20 61 20 62 75 66 66 65 72 20 61 6c 6c   in a buffer all
354b0 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65  ocated by sqlite
354c0 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 73 71 6c 69  3_malloc(). sqli
354d0 74 65 33 5f 66 72 65 65 28 29 20 69 73 20 63 61  te3_free() is ca
354e0 6c 6c 65 64 20 6f 6e 0a 2a 2a 20 7a 49 6e 20 62  lled on.** zIn b
354f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
35500 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
35510 2a 69 64 78 41 70 70 65 6e 64 54 65 78 74 28 69  *idxAppendText(i
35520 6e 74 20 2a 70 52 63 2c 20 63 68 61 72 20 2a 7a  nt *pRc, char *z
35530 49 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  In, const char *
35540 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zFmt, ...){.  va
35550 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
35560 20 2a 7a 41 70 70 65 6e 64 20 3d 20 30 3b 0a 20   *zAppend = 0;. 
35570 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
35580 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 7a 49 6e  .  int nIn = zIn
35590 20 3f 20 53 54 52 4c 45 4e 28 7a 49 6e 29 20 3a   ? STRLEN(zIn) :
355a0 20 30 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   0;.  int nAppen
355b0 64 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61 72  d = 0;.  va_star
355c0 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 69  t(ap, zFmt);.  i
355d0 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
355e0 4f 4b 20 29 7b 0a 20 20 20 20 7a 41 70 70 65 6e  OK ){.    zAppen
355f0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  d = sqlite3_vmpr
35600 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
35610 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64 20      if( zAppend 
35620 29 7b 0a 20 20 20 20 20 20 6e 41 70 70 65 6e 64  ){.      nAppend
35630 20 3d 20 53 54 52 4c 45 4e 28 7a 41 70 70 65 6e   = STRLEN(zAppen
35640 64 29 3b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d  d);.      zRet =
35650 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
35660 6d 61 6c 6c 6f 63 28 6e 49 6e 20 2b 20 6e 41 70  malloc(nIn + nAp
35670 70 65 6e 64 20 2b 20 31 29 3b 0a 20 20 20 20 7d  pend + 1);.    }
35680 0a 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64  .    if( zAppend
35690 20 26 26 20 7a 52 65 74 20 29 7b 0a 20 20 20 20   && zRet ){.    
356a0 20 20 69 66 28 20 6e 49 6e 20 29 20 6d 65 6d 63    if( nIn ) memc
356b0 70 79 28 7a 52 65 74 2c 20 7a 49 6e 2c 20 6e 49  py(zRet, zIn, nI
356c0 6e 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  n);.      memcpy
356d0 28 26 7a 52 65 74 5b 6e 49 6e 5d 2c 20 7a 41 70  (&zRet[nIn], zAp
356e0 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 2b 31 29  pend, nAppend+1)
356f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35700 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
35710 7a 52 65 74 29 3b 0a 20 20 20 20 20 20 7a 52 65  zRet);.      zRe
35720 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 52  t = 0;.      *pR
35730 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
35740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
35750 74 65 33 5f 66 72 65 65 28 7a 41 70 70 65 6e 64  te3_free(zAppend
35760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
35770 72 65 65 28 7a 49 6e 29 3b 0a 20 20 7d 0a 20 20  ree(zIn);.  }.  
35780 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
35790 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn zRet;.}../*
357a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
357b0 69 66 20 7a 49 64 20 6d 75 73 74 20 62 65 20 71  if zId must be q
357c0 75 6f 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uoted in order t
357d0 6f 20 75 73 65 20 69 74 20 61 73 20 61 6e 20 53  o use it as an S
357e0 51 4c 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  QL.** identifier
357f0 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
35800 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
35810 69 6e 74 20 69 64 78 49 64 65 6e 74 69 66 69 65  int idxIdentifie
35820 72 52 65 71 75 69 72 65 73 51 75 6f 74 65 73 28  rRequiresQuotes(
35830 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 29  const char *zId)
35840 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
35850 28 69 3d 30 3b 20 7a 49 64 5b 69 5d 3b 20 69 2b  (i=0; zId[i]; i+
35860 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 28 7a 49  +){.    if( !(zI
35870 64 5b 69 5d 3d 3d 27 5f 27 29 0a 20 20 20 20 20  d[i]=='_').     
35880 26 26 20 21 28 7a 49 64 5b 69 5d 3e 3d 27 30 27  && !(zId[i]>='0'
35890 20 26 26 20 7a 49 64 5b 69 5d 3c 3d 27 39 27 29   && zId[i]<='9')
358a0 0a 20 20 20 20 20 26 26 20 21 28 7a 49 64 5b 69  .     && !(zId[i
358b0 5d 3e 3d 27 61 27 20 26 26 20 7a 49 64 5b 69 5d  ]>='a' && zId[i]
358c0 3c 3d 27 7a 27 29 0a 20 20 20 20 20 26 26 20 21  <='z').     && !
358d0 28 7a 49 64 5b 69 5d 3e 3d 27 41 27 20 26 26 20  (zId[i]>='A' && 
358e0 7a 49 64 5b 69 5d 3c 3d 27 5a 27 29 0a 20 20 20  zId[i]<='Z').   
358f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35900 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
35910 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
35920 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35930 20 61 70 70 65 6e 64 73 20 61 6e 20 69 6e 64 65   appends an inde
35940 78 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  x column definit
35950 69 6f 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ion suitable for
35960 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 70   constraint.** p
35970 43 6f 6e 73 20 74 6f 20 74 68 65 20 73 74 72 69  Cons to the stri
35980 6e 67 20 70 61 73 73 65 64 20 61 73 20 7a 49 6e  ng passed as zIn
35990 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
359a0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
359b0 69 63 20 63 68 61 72 20 2a 69 64 78 41 70 70 65  ic char *idxAppe
359c0 6e 64 43 6f 6c 44 65 66 6e 28 0a 20 20 69 6e 74  ndColDefn(.  int
359d0 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
359e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
359f0 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f  IN/OUT: Error co
35a00 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49  de */.  char *zI
35a10 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
35a20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
35a30 6e 20 64 65 66 6e 20 61 63 63 75 6d 75 6c 61 74  n defn accumulat
35a40 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 49  ed so far */.  I
35a50 64 78 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20  dxTable *pTab,  
35a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35a70 2a 20 54 61 62 6c 65 20 69 6e 64 65 78 20 77 69  * Table index wi
35a80 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 6f 6e  ll be created on
35a90 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72 61   */.  IdxConstra
35aa0 69 6e 74 20 2a 70 43 6f 6e 73 0a 29 7b 0a 20 20  int *pCons.){.  
35ab0 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 7a 49 6e  char *zRet = zIn
35ac0 3b 0a 20 20 49 64 78 43 6f 6c 75 6d 6e 20 2a 70  ;.  IdxColumn *p
35ad0 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   = &pTab->aCol[p
35ae0 43 6f 6e 73 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 69  Cons->iCol];.  i
35af0 66 28 20 7a 52 65 74 20 29 20 7a 52 65 74 20 3d  f( zRet ) zRet =
35b00 20 69 64 78 41 70 70 65 6e 64 54 65 78 74 28 70   idxAppendText(p
35b10 52 63 2c 20 7a 52 65 74 2c 20 22 2c 20 22 29 3b  Rc, zRet, ", ");
35b20 0a 0a 20 20 69 66 28 20 69 64 78 49 64 65 6e 74  ..  if( idxIdent
35b30 69 66 69 65 72 52 65 71 75 69 72 65 73 51 75 6f  ifierRequiresQuo
35b40 74 65 73 28 70 2d 3e 7a 4e 61 6d 65 29 20 29 7b  tes(p->zName) ){
35b50 0a 20 20 20 20 7a 52 65 74 20 3d 20 69 64 78 41  .    zRet = idxA
35b60 70 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20 7a  ppendText(pRc, z
35b70 52 65 74 2c 20 22 25 51 22 2c 20 70 2d 3e 7a 4e  Ret, "%Q", p->zN
35b80 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
35b90 20 20 20 7a 52 65 74 20 3d 20 69 64 78 41 70 70     zRet = idxApp
35ba0 65 6e 64 54 65 78 74 28 70 52 63 2c 20 7a 52 65  endText(pRc, zRe
35bb0 74 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  t, "%s", p->zNam
35bc0 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  e);.  }..  if( s
35bd0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
35be0 2d 3e 7a 43 6f 6c 6c 2c 20 70 43 6f 6e 73 2d 3e  ->zColl, pCons->
35bf0 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 69 66  zColl) ){.    if
35c00 28 20 69 64 78 49 64 65 6e 74 69 66 69 65 72 52  ( idxIdentifierR
35c10 65 71 75 69 72 65 73 51 75 6f 74 65 73 28 70 43  equiresQuotes(pC
35c20 6f 6e 73 2d 3e 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ons->zColl) ){. 
35c30 20 20 20 20 20 7a 52 65 74 20 3d 20 69 64 78 41       zRet = idxA
35c40 70 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20 7a  ppendText(pRc, z
35c50 52 65 74 2c 20 22 20 43 4f 4c 4c 41 54 45 20 25  Ret, " COLLATE %
35c60 51 22 2c 20 70 43 6f 6e 73 2d 3e 7a 43 6f 6c 6c  Q", pCons->zColl
35c70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35c80 20 20 20 20 7a 52 65 74 20 3d 20 69 64 78 41 70      zRet = idxAp
35c90 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20 7a 52  pendText(pRc, zR
35ca0 65 74 2c 20 22 20 43 4f 4c 4c 41 54 45 20 25 73  et, " COLLATE %s
35cb0 22 2c 20 70 43 6f 6e 73 2d 3e 7a 43 6f 6c 6c 29  ", pCons->zColl)
35cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
35cd0 66 28 20 70 43 6f 6e 73 2d 3e 62 44 65 73 63 20  f( pCons->bDesc 
35ce0 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 69 64  ){.    zRet = id
35cf0 78 41 70 70 65 6e 64 54 65 78 74 28 70 52 63 2c  xAppendText(pRc,
35d00 20 7a 52 65 74 2c 20 22 20 44 45 53 43 22 29 3b   zRet, " DESC");
35d10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
35d20 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  et;.}../*.** Sea
35d30 72 63 68 20 64 61 74 61 62 61 73 65 20 64 62 6d  rch database dbm
35d40 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 63 6f   for an index co
35d50 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
35d60 65 20 6f 6e 65 20 69 64 78 43 72 65 61 74 65 46  e one idxCreateF
35d70 72 6f 6d 43 6f 6e 73 28 29 0a 2a 2a 20 77 6f 75  romCons().** wou
35d80 6c 64 20 63 72 65 61 74 65 20 66 72 6f 6d 20 61  ld create from a
35d90 72 67 75 6d 65 6e 74 73 20 70 53 63 61 6e 2c 20  rguments pScan, 
35da0 70 45 71 20 61 6e 64 20 70 54 61 69 6c 2e 20 49  pEq and pTail. I
35db0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
35dc0 73 20 61 6e 64 20 0a 2a 2a 20 73 75 63 68 20 61  s and .** such a
35dd0 6e 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64  n index is found
35de0 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
35df0 6f 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75 63  o. Or, if no suc
35e00 68 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64  h index is found
35e10 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72 6f  ,.** return zero
35e20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
35e30 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
35e40 2a 70 52 63 20 74 6f 20 61 6e 20 53 51 4c 69 74  *pRc to an SQLit
35e50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
35e60 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f   return zero..*/
35e70 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 78 46  .static int idxF
35e80 69 6e 64 43 6f 6d 70 61 74 69 62 6c 65 28 0a 20  indCompatible(. 
35e90 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
35ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35eb0 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 63   /* OUT: Error c
35ec0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
35ed0 2a 20 64 62 6d 2c 20 20 20 20 20 20 20 20 20 20  * dbm,          
35ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
35ef0 62 61 73 65 20 74 6f 20 73 65 61 72 63 68 20 2a  base to search *
35f00 2f 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 53 63  /.  IdxScan *pSc
35f10 61 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  an,             
35f20 20 20 20 20 2f 2a 20 53 63 61 6e 20 66 6f 72 20      /* Scan for 
35f30 74 61 62 6c 65 20 74 6f 20 73 65 61 72 63 68 20  table to search 
35f40 66 6f 72 20 69 6e 64 65 78 20 6f 6e 20 2a 2f 0a  for index on */.
35f50 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
35f60 2a 70 45 71 2c 20 20 20 20 20 20 20 20 20 20 20  *pEq,           
35f70 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 3d 3d 20    /* List of == 
35f80 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
35f90 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
35fa0 70 54 61 69 6c 20 20 20 20 20 20 20 20 20 20 20  pTail           
35fb0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 72 61 6e 67   /* List of rang
35fc0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
35fd0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
35fe0 20 2a 7a 54 62 6c 20 3d 20 70 53 63 61 6e 2d 3e   *zTbl = pScan->
35ff0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  pTab->zName;.  s
36000 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
36010 78 4c 69 73 74 20 3d 20 30 3b 0a 20 20 49 64 78  xList = 0;.  Idx
36020 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 74 65  Constraint *pIte
36030 72 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 30  r;.  int nEq = 0
36040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36060 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 45  f elements in pE
36070 71 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  q */.  int rc;..
36080 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 65    /* Count the e
36090 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20  lements in list 
360a0 70 45 71 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  pEq */.  for(pIt
360b0 65 72 3d 70 45 71 3b 20 70 49 74 65 72 3b 20 70  er=pEq; pIter; p
360c0 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4c 69 6e  Iter=pIter->pLin
360d0 6b 29 20 6e 45 71 2b 2b 3b 0a 0a 20 20 72 63 20  k) nEq++;..  rc 
360e0 3d 20 69 64 78 50 72 69 6e 74 66 50 72 65 70 61  = idxPrintfPrepa
360f0 72 65 53 74 6d 74 28 64 62 6d 2c 20 26 70 49 64  reStmt(dbm, &pId
36100 78 4c 69 73 74 2c 20 30 2c 20 22 50 52 41 47 4d  xList, 0, "PRAGM
36110 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25 51 22  A index_list=%Q"
36120 2c 20 7a 54 62 6c 29 3b 0a 20 20 77 68 69 6c 65  , zTbl);.  while
36130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36140 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
36150 70 49 64 78 4c 69 73 74 29 3d 3d 53 51 4c 49 54  pIdxList)==SQLIT
36160 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74  E_ROW ){.    int
36170 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20   bMatch = 1;.   
36180 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
36190 70 54 20 3d 20 70 54 61 69 6c 3b 0a 20 20 20 20  pT = pTail;.    
361a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
361b0 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  nfo = 0;.    con
361c0 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
361d0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
361e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
361f0 28 70 49 64 78 4c 69 73 74 2c 20 31 29 3b 0a 0a  (pIdxList, 1);..
36200 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20      /* Zero the 
36210 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2e 62 46  IdxConstraint.bF
36220 6c 61 67 20 76 61 6c 75 65 73 20 69 6e 20 74 68  lag values in th
36230 65 20 70 45 71 20 6c 69 73 74 20 2a 2f 0a 20 20  e pEq list */.  
36240 20 20 66 6f 72 28 70 49 74 65 72 3d 70 45 71 3b    for(pIter=pEq;
36250 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
36260 74 65 72 2d 3e 70 4c 69 6e 6b 29 20 70 49 74 65  ter->pLink) pIte
36270 72 2d 3e 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20  r->bFlag = 0;.. 
36280 20 20 20 72 63 20 3d 20 69 64 78 50 72 69 6e 74     rc = idxPrint
36290 66 50 72 65 70 61 72 65 53 74 6d 74 28 64 62 6d  fPrepareStmt(dbm
362a0 2c 20 26 70 49 6e 66 6f 2c 20 30 2c 20 22 50 52  , &pInfo, 0, "PR
362b0 41 47 4d 41 20 69 6e 64 65 78 5f 78 49 6e 66 6f  AGMA index_xInfo
362c0 3d 25 51 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20  =%Q", zIdx);.   
362d0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
362e0 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
362f0 5f 73 74 65 70 28 70 49 6e 66 6f 29 3d 3d 53 51  _step(pInfo)==SQ
36300 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
36310 20 20 69 6e 74 20 69 49 64 78 20 3d 20 73 71 6c    int iIdx = sql
36320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
36330 70 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 20  pInfo, 0);.     
36340 20 69 6e 74 20 69 43 6f 6c 20 3d 20 73 71 6c 69   int iCol = sqli
36350 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
36360 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20  Info, 1);.      
36370 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
36380 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
36390 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
363a0 74 65 78 74 28 70 49 6e 66 6f 2c 20 34 29 3b 0a  text(pInfo, 4);.
363b0 0a 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3c  .      if( iIdx<
363c0 6e 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 66  nEq ){.        f
363d0 6f 72 28 70 49 74 65 72 3d 70 45 71 3b 20 70 49  or(pIter=pEq; pI
363e0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
363f0 2d 3e 70 4c 69 6e 6b 29 7b 0a 20 20 20 20 20 20  ->pLink){.      
36400 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
36410 46 6c 61 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Flag ) continue;
36420 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
36430 49 74 65 72 2d 3e 69 43 6f 6c 21 3d 69 43 6f 6c  Iter->iCol!=iCol
36440 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
36450 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
36460 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 72  e3_stricmp(pIter
36470 2d 3e 7a 43 6f 6c 6c 2c 20 7a 43 6f 6c 6c 29 20  ->zColl, zColl) 
36480 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
36490 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 46 6c        pIter->bFl
364a0 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ag = 1;.        
364b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
364c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
364d0 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Iter==0 ){.     
364e0 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b       bMatch = 0;
364f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
36500 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36520 20 69 66 28 20 70 54 20 29 7b 0a 20 20 20 20 20   if( pT ){.     
36530 20 20 20 20 20 69 66 28 20 70 54 2d 3e 69 43 6f       if( pT->iCo
36540 6c 21 3d 69 43 6f 6c 20 7c 7c 20 73 71 6c 69 74  l!=iCol || sqlit
36550 65 33 5f 73 74 72 69 63 6d 70 28 70 54 2d 3e 7a  e3_stricmp(pT->z
36560 43 6f 6c 6c 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  Coll, zColl) ){.
36570 20 20 20 20 20 20 20 20 20 20 20 20 62 4d 61 74              bMat
36580 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
36590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
365a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
365b0 20 70 54 20 3d 20 70 54 2d 3e 70 4c 69 6e 6b 3b   pT = pT->pLink;
365c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
365d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78   }.    }.    idx
365e0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 49  Finalize(&rc, pI
365f0 6e 66 6f 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  nfo);..    if( r
36600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36610 62 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  bMatch ){.      
36620 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
36630 28 70 49 64 78 4c 69 73 74 29 3b 0a 20 20 20 20  (pIdxList);.    
36640 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
36650 7d 0a 20 20 7d 0a 20 20 69 64 78 46 69 6e 61 6c  }.  }.  idxFinal
36660 69 7a 65 28 26 72 63 2c 20 70 49 64 78 4c 69 73  ize(&rc, pIdxLis
36670 74 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72 63  t);..  *pRc = rc
36680 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
36690 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 78 43  .static int idxC
366a0 72 65 61 74 65 46 72 6f 6d 43 6f 6e 73 28 0a 20  reateFromCons(. 
366b0 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a   sqlite3expert *
366c0 70 2c 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 53  p,.  IdxScan *pS
366d0 63 61 6e 2c 0a 20 20 49 64 78 43 6f 6e 73 74 72  can,.  IdxConstr
366e0 61 69 6e 74 20 2a 70 45 71 2c 20 0a 20 20 49 64  aint *pEq, .  Id
366f0 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 54 61  xConstraint *pTa
36700 69 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  il.){.  sqlite3 
36710 2a 64 62 6d 20 3d 20 70 2d 3e 64 62 6d 3b 0a 20  *dbm = p->dbm;. 
36720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36730 5f 4f 4b 3b 0a 20 20 69 66 28 20 28 70 45 71 20  _OK;.  if( (pEq 
36740 7c 7c 20 70 54 61 69 6c 29 20 26 26 20 30 3d 3d  || pTail) && 0==
36750 69 64 78 46 69 6e 64 43 6f 6d 70 61 74 69 62 6c  idxFindCompatibl
36760 65 28 26 72 63 2c 20 64 62 6d 2c 20 70 53 63 61  e(&rc, dbm, pSca
36770 6e 2c 20 70 45 71 2c 20 70 54 61 69 6c 29 20 29  n, pEq, pTail) )
36780 7b 0a 20 20 20 20 49 64 78 54 61 62 6c 65 20 2a  {.    IdxTable *
36790 70 54 61 62 20 3d 20 70 53 63 61 6e 2d 3e 70 54  pTab = pScan->pT
367a0 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  ab;.    char *zC
367b0 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ols = 0;.    cha
367c0 72 20 2a 7a 49 64 78 20 3d 20 30 3b 0a 20 20 20  r *zIdx = 0;.   
367d0 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
367e0 70 43 6f 6e 73 3b 0a 20 20 20 20 75 6e 73 69 67  pCons;.    unsig
367f0 6e 65 64 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20  ned int h = 0;. 
36800 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
36810 46 6d 74 3b 0a 0a 20 20 20 20 66 6f 72 28 70 43  Fmt;..    for(pC
36820 6f 6e 73 3d 70 45 71 3b 20 70 43 6f 6e 73 3b 20  ons=pEq; pCons; 
36830 70 43 6f 6e 73 3d 70 43 6f 6e 73 2d 3e 70 4c 69  pCons=pCons->pLi
36840 6e 6b 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 73  nk){.      zCols
36850 20 3d 20 69 64 78 41 70 70 65 6e 64 43 6f 6c 44   = idxAppendColD
36860 65 66 6e 28 26 72 63 2c 20 7a 43 6f 6c 73 2c 20  efn(&rc, zCols, 
36870 70 54 61 62 2c 20 70 43 6f 6e 73 29 3b 0a 20 20  pTab, pCons);.  
36880 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 43 6f 6e    }.    for(pCon
36890 73 3d 70 54 61 69 6c 3b 20 70 43 6f 6e 73 3b 20  s=pTail; pCons; 
368a0 70 43 6f 6e 73 3d 70 43 6f 6e 73 2d 3e 70 4c 69  pCons=pCons->pLi
368b0 6e 6b 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 73  nk){.      zCols
368c0 20 3d 20 69 64 78 41 70 70 65 6e 64 43 6f 6c 44   = idxAppendColD
368d0 65 66 6e 28 26 72 63 2c 20 7a 43 6f 6c 73 2c 20  efn(&rc, zCols, 
368e0 70 54 61 62 2c 20 70 43 6f 6e 73 29 3b 0a 20 20  pTab, pCons);.  
368f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
36900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36910 20 20 20 20 2f 2a 20 48 61 73 68 20 74 68 65 20      /* Hash the 
36920 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
36930 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
36940 61 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 69  a name for the i
36950 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 63 6f  ndex */.      co
36960 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
36970 20 3d 20 70 53 63 61 6e 2d 3e 70 54 61 62 2d 3e   = pScan->pTab->
36980 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 68 61  zName;.      cha
36990 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
369a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
369b0 78 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  x name */.      
369c0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
369d0 28 69 3d 30 3b 20 7a 43 6f 6c 73 5b 69 5d 3b 20  (i=0; zCols[i]; 
369e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 68 20  i++){.        h 
369f0 2b 3d 20 28 28 68 3c 3c 33 29 20 2b 20 7a 43 6f  += ((h<<3) + zCo
36a00 6c 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ls[i]);.      }.
36a10 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
36a20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
36a30 73 5f 69 64 78 5f 25 30 38 78 22 2c 20 7a 54 61  s_idx_%08x", zTa
36a40 62 6c 65 2c 20 68 29 3b 0a 20 20 20 20 20 20 69  ble, h);.      i
36a50 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 20 0a  f( zName==0 ){ .
36a60 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
36a70 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
36a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
36a90 69 66 28 20 69 64 78 49 64 65 6e 74 69 66 69 65  if( idxIdentifie
36aa0 72 52 65 71 75 69 72 65 73 51 75 6f 74 65 73 28  rRequiresQuotes(
36ab0 7a 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  zTable) ){.     
36ac0 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 52 45       zFmt = "CRE
36ad0 41 54 45 20 49 4e 44 45 58 20 27 25 71 27 20 4f  ATE INDEX '%q' O
36ae0 4e 20 25 51 28 25 73 29 22 3b 0a 20 20 20 20 20  N %Q(%s)";.     
36af0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36b00 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 52 45 41      zFmt = "CREA
36b10 54 45 20 49 4e 44 45 58 20 25 73 20 4f 4e 20 25  TE INDEX %s ON %
36b20 73 28 25 73 29 22 3b 0a 20 20 20 20 20 20 20 20  s(%s)";.        
36b30 7d 0a 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d  }.        zIdx =
36b40 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
36b50 28 7a 46 6d 74 2c 20 7a 4e 61 6d 65 2c 20 7a 54  (zFmt, zName, zT
36b60 61 62 6c 65 2c 20 7a 43 6f 6c 73 29 3b 0a 20 20  able, zCols);.  
36b70 20 20 20 20 20 20 69 66 28 20 21 7a 49 64 78 20        if( !zIdx 
36b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
36b90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
36ba0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
36bb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
36bc0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 6d 2c 20  lite3_exec(dbm, 
36bd0 7a 49 64 78 2c 20 30 2c 20 30 2c 20 70 2d 3e 70  zIdx, 0, 0, p->p
36be0 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
36bf0 20 20 20 20 69 64 78 48 61 73 68 41 64 64 28 26      idxHashAdd(&
36c00 72 63 2c 20 26 70 2d 3e 68 49 64 78 2c 20 7a 4e  rc, &p->hIdx, zN
36c10 61 6d 65 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20  ame, zIdx);.    
36c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
36c30 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
36c40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36c50 65 33 5f 66 72 65 65 28 7a 49 64 78 29 3b 0a 20  e3_free(zIdx);. 
36c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
36c70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
36c80 43 6f 6c 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Cols);.  }.  ret
36c90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36ca0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
36cb0 6c 69 73 74 20 70 4c 69 73 74 20 28 6c 69 6e 6b  list pList (link
36cc0 65 64 20 62 79 20 49 64 78 43 6f 6e 73 74 72 61  ed by IdxConstra
36cd0 69 6e 74 2e 70 4c 69 6e 6b 29 20 63 6f 6e 74 61  int.pLink) conta
36ce0 69 6e 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 72 61  ins.** a constra
36cf0 69 6e 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77  int compatible w
36d00 69 74 68 20 2a 70 2e 20 4f 74 68 65 72 77 69 73  ith *p. Otherwis
36d10 65 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a  e return false..
36d20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
36d30 78 46 69 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28  xFindConstraint(
36d40 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  IdxConstraint *p
36d50 4c 69 73 74 2c 20 49 64 78 43 6f 6e 73 74 72 61  List, IdxConstra
36d60 69 6e 74 20 2a 70 29 7b 0a 20 20 49 64 78 43 6f  int *p){.  IdxCo
36d70 6e 73 74 72 61 69 6e 74 20 2a 70 43 6d 70 3b 0a  nstraint *pCmp;.
36d80 20 20 66 6f 72 28 70 43 6d 70 3d 70 4c 69 73 74    for(pCmp=pList
36d90 3b 20 70 43 6d 70 3b 20 70 43 6d 70 3d 70 43 6d  ; pCmp; pCmp=pCm
36da0 70 2d 3e 70 4c 69 6e 6b 29 7b 0a 20 20 20 20 69  p->pLink){.    i
36db0 66 28 20 70 2d 3e 69 43 6f 6c 3d 3d 70 43 6d 70  f( p->iCol==pCmp
36dc0 2d 3e 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20  ->iCol ) return 
36dd0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
36de0 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  0;.}..static int
36df0 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d 57 68   idxCreateFromWh
36e00 65 72 65 28 0a 20 20 73 71 6c 69 74 65 33 65 78  ere(.  sqlite3ex
36e10 70 65 72 74 20 2a 70 2c 20 0a 20 20 49 64 78 53  pert *p, .  IdxS
36e20 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
36e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
36e40 72 65 61 74 65 20 69 6e 64 65 78 65 73 20 66 6f  reate indexes fo
36e50 72 20 74 68 69 73 20 73 63 61 6e 20 2a 2f 0a 20  r this scan */. 
36e60 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
36e70 70 54 61 69 6c 20 20 20 20 20 20 20 20 20 20 20  pTail           
36e80 20 2f 2a 20 72 61 6e 67 65 2f 4f 52 44 45 52 20   /* range/ORDER 
36e90 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  BY constraints f
36ea0 6f 72 20 69 6e 63 6c 75 73 69 6f 6e 20 2a 2f 0a  or inclusion */.
36eb0 29 7b 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69  ){.  IdxConstrai
36ec0 6e 74 20 2a 70 31 20 3d 20 30 3b 0a 20 20 49 64  nt *p1 = 0;.  Id
36ed0 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  xConstraint *pCo
36ee0 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
36ef0 2f 2a 20 47 61 74 68 65 72 20 75 70 20 61 6c 6c  /* Gather up all
36f00 20 74 68 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69   the == constrai
36f10 6e 74 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 43  nts. */.  for(pC
36f20 6f 6e 3d 70 53 63 61 6e 2d 3e 70 45 71 3b 20 70  on=pScan->pEq; p
36f30 43 6f 6e 3b 20 70 43 6f 6e 3d 70 43 6f 6e 2d 3e  Con; pCon=pCon->
36f40 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
36f50 21 69 64 78 46 69 6e 64 43 6f 6e 73 74 72 61 69  !idxFindConstrai
36f60 6e 74 28 70 31 2c 20 70 43 6f 6e 29 20 26 26 20  nt(p1, pCon) && 
36f70 21 69 64 78 46 69 6e 64 43 6f 6e 73 74 72 61 69  !idxFindConstrai
36f80 6e 74 28 70 54 61 69 6c 2c 20 70 43 6f 6e 29 20  nt(pTail, pCon) 
36f90 29 7b 0a 20 20 20 20 20 20 70 43 6f 6e 2d 3e 70  ){.      pCon->p
36fa0 4c 69 6e 6b 20 3d 20 70 31 3b 0a 20 20 20 20 20  Link = p1;.     
36fb0 20 70 31 20 3d 20 70 43 6f 6e 3b 0a 20 20 20 20   p1 = pCon;.    
36fc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  }.  }..  /* Crea
36fd0 74 65 20 61 6e 20 69 6e 64 65 78 20 75 73 69 6e  te an index usin
36fe0 67 20 74 68 65 20 3d 3d 20 63 6f 6e 73 74 72 61  g the == constra
36ff0 69 6e 74 73 20 63 6f 6c 6c 65 63 74 65 64 20 61  ints collected a
37000 62 6f 76 65 2e 20 41 6e 64 20 74 68 65 0a 20 20  bove. And the.  
37010 2a 2a 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ** range constra
37020 69 6e 74 2f 4f 52 44 45 52 20 42 59 20 74 65 72  int/ORDER BY ter
37030 6d 73 20 70 61 73 73 65 64 20 69 6e 20 62 79 20  ms passed in by 
37040 74 68 65 20 63 61 6c 6c 65 72 2c 20 69 66 20 61  the caller, if a
37050 6e 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 69 64  ny. */.  rc = id
37060 78 43 72 65 61 74 65 46 72 6f 6d 43 6f 6e 73 28  xCreateFromCons(
37070 70 2c 20 70 53 63 61 6e 2c 20 70 31 2c 20 70 54  p, pScan, p1, pT
37080 61 69 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  ail);..  /* If n
37090 6f 20 72 61 6e 67 65 2f 4f 52 44 45 52 20 42 59  o range/ORDER BY
370a0 20 70 61 73 73 65 64 20 62 79 20 74 68 65 20 63   passed by the c
370b0 61 6c 6c 65 72 2c 20 63 72 65 61 74 65 20 61 20  aller, create a 
370c0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 0a 20  version of the. 
370d0 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 65 61   ** index for ea
370e0 63 68 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ch range constra
370f0 69 6e 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  int.  */.  if( p
37100 54 61 69 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 66  Tail==0 ){.    f
37110 6f 72 28 70 43 6f 6e 3d 70 53 63 61 6e 2d 3e 70  or(pCon=pScan->p
37120 52 61 6e 67 65 3b 20 72 63 3d 3d 53 51 4c 49 54  Range; rc==SQLIT
37130 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 3b 20 70 43  E_OK && pCon; pC
37140 6f 6e 3d 70 43 6f 6e 2d 3e 70 4e 65 78 74 29 7b  on=pCon->pNext){
37150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
37160 43 6f 6e 2d 3e 70 4c 69 6e 6b 3d 3d 30 20 29 3b  Con->pLink==0 );
37170 0a 20 20 20 20 20 20 69 66 28 20 21 69 64 78 46  .      if( !idxF
37180 69 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 31  indConstraint(p1
37190 2c 20 70 43 6f 6e 29 20 26 26 20 21 69 64 78 46  , pCon) && !idxF
371a0 69 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 54  indConstraint(pT
371b0 61 69 6c 2c 20 70 43 6f 6e 29 20 29 7b 0a 20 20  ail, pCon) ){.  
371c0 20 20 20 20 20 20 72 63 20 3d 20 69 64 78 43 72        rc = idxCr
371d0 65 61 74 65 46 72 6f 6d 43 6f 6e 73 28 70 2c 20  eateFromCons(p, 
371e0 70 53 63 61 6e 2c 20 70 31 2c 20 70 43 6f 6e 29  pScan, p1, pCon)
371f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37200 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
37210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
37220 65 20 63 61 6e 64 69 64 61 74 65 20 69 6e 64 65  e candidate inde
37230 78 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  xes in database 
37240 5b 64 62 6d 5d 20 62 61 73 65 64 20 6f 6e 20 74  [dbm] based on t
37250 68 65 20 64 61 74 61 20 69 6e 20 0a 2a 2a 20 6c  he data in .** l
37260 69 6e 6b 65 64 2d 6c 69 73 74 20 70 53 63 61 6e  inked-list pScan
37270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37280 69 64 78 43 72 65 61 74 65 43 61 6e 64 69 64 61  idxCreateCandida
37290 74 65 73 28 73 71 6c 69 74 65 33 65 78 70 65 72  tes(sqlite3exper
372a0 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  t *p){.  int rc 
372b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 49  = SQLITE_OK;.  I
372c0 64 78 53 63 61 6e 20 2a 70 49 74 65 72 3b 0a 0a  dxScan *pIter;..
372d0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 2d 3e 70    for(pIter=p->p
372e0 53 63 61 6e 3b 20 70 49 74 65 72 20 26 26 20 72  Scan; pIter && r
372f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 49  c==SQLITE_OK; pI
37300 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
37310 53 63 61 6e 29 7b 0a 20 20 20 20 72 63 20 3d 20  Scan){.    rc = 
37320 69 64 78 43 72 65 61 74 65 46 72 6f 6d 57 68 65  idxCreateFromWhe
37330 72 65 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  re(p, pIter, 0);
37340 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
37350 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
37360 3e 70 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  >pOrder ){.     
37370 20 72 63 20 3d 20 69 64 78 43 72 65 61 74 65 46   rc = idxCreateF
37380 72 6f 6d 57 68 65 72 65 28 70 2c 20 70 49 74 65  romWhere(p, pIte
37390 72 2c 20 70 49 74 65 72 2d 3e 70 4f 72 64 65 72  r, pIter->pOrder
373a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
373b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
373c0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65  .** Free all ele
373d0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 6e  ments of the lin
373e0 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
373f0 67 20 61 74 20 70 43 6f 6e 73 74 72 61 69 6e 74  g at pConstraint
37400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37410 20 69 64 78 43 6f 6e 73 74 72 61 69 6e 74 46 72   idxConstraintFr
37420 65 65 28 49 64 78 43 6f 6e 73 74 72 61 69 6e 74  ee(IdxConstraint
37430 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 29 7b 0a   *pConstraint){.
37440 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
37450 2a 70 4e 65 78 74 3b 0a 20 20 49 64 78 43 6f 6e  *pNext;.  IdxCon
37460 73 74 72 61 69 6e 74 20 2a 70 3b 0a 0a 20 20 66  straint *p;..  f
37470 6f 72 28 70 3d 70 43 6f 6e 73 74 72 61 69 6e 74  or(p=pConstraint
37480 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
37490 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
374a0 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
374b0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
374c0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
374d0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
374e0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
374f0 74 69 6e 67 20 66 72 6f 6d 20 70 53 63 61 6e 20  ting from pScan 
37500 75 70 20 75 6e 74 69 6c 20 70 4c 61 73 74 0a 2a  up until pLast.*
37510 2a 20 28 70 4c 61 73 74 20 69 73 20 6e 6f 74 20  * (pLast is not 
37520 66 72 65 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  freed)..*/.stati
37530 63 20 76 6f 69 64 20 69 64 78 53 63 61 6e 46 72  c void idxScanFr
37540 65 65 28 49 64 78 53 63 61 6e 20 2a 70 53 63 61  ee(IdxScan *pSca
37550 6e 2c 20 49 64 78 53 63 61 6e 20 2a 70 4c 61 73  n, IdxScan *pLas
37560 74 29 7b 0a 20 20 49 64 78 53 63 61 6e 20 2a 70  t){.  IdxScan *p
37570 3b 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 4e 65  ;.  IdxScan *pNe
37580 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 53 63 61  xt;.  for(p=pSca
37590 6e 3b 20 70 21 3d 70 4c 61 73 74 3b 20 70 3d 70  n; p!=pLast; p=p
375a0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
375b0 20 3d 20 70 2d 3e 70 4e 65 78 74 53 63 61 6e 3b   = p->pNextScan;
375c0 0a 20 20 20 20 69 64 78 43 6f 6e 73 74 72 61 69  .    idxConstrai
375d0 6e 74 46 72 65 65 28 70 2d 3e 70 4f 72 64 65 72  ntFree(p->pOrder
375e0 29 3b 0a 20 20 20 20 69 64 78 43 6f 6e 73 74 72  );.    idxConstr
375f0 61 69 6e 74 46 72 65 65 28 70 2d 3e 70 45 71 29  aintFree(p->pEq)
37600 3b 0a 20 20 20 20 69 64 78 43 6f 6e 73 74 72 61  ;.    idxConstra
37610 69 6e 74 46 72 65 65 28 70 2d 3e 70 52 61 6e 67  intFree(p->pRang
37620 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
37630 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
37640 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 65  /*.** Free all e
37650 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 6c  lements of the l
37660 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
37670 69 6e 67 20 66 72 6f 6d 20 70 53 74 61 74 65 6d  ing from pStatem
37680 65 6e 74 20 75 70 20 0a 2a 2a 20 75 6e 74 69 6c  ent up .** until
37690 20 70 4c 61 73 74 20 28 70 4c 61 73 74 20 69 73   pLast (pLast is
376a0 20 6e 6f 74 20 66 72 65 65 64 29 2e 0a 2a 2f 0a   not freed)..*/.
376b0 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 78 53  static void idxS
376c0 74 61 74 65 6d 65 6e 74 46 72 65 65 28 49 64 78  tatementFree(Idx
376d0 53 74 61 74 65 6d 65 6e 74 20 2a 70 53 74 61 74  Statement *pStat
376e0 65 6d 65 6e 74 2c 20 49 64 78 53 74 61 74 65 6d  ement, IdxStatem
376f0 65 6e 74 20 2a 70 4c 61 73 74 29 7b 0a 20 20 49  ent *pLast){.  I
37700 64 78 53 74 61 74 65 6d 65 6e 74 20 2a 70 3b 0a  dxStatement *p;.
37710 20 20 49 64 78 53 74 61 74 65 6d 65 6e 74 20 2a    IdxStatement *
37720 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
37730 53 74 61 74 65 6d 65 6e 74 3b 20 70 21 3d 70 4c  Statement; p!=pL
37740 61 73 74 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ast; p=pNext){. 
37750 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
37760 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
37770 5f 66 72 65 65 28 70 2d 3e 7a 45 51 50 29 3b 0a  _free(p->zEQP);.
37780 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
37790 28 70 2d 3e 7a 49 64 78 29 3b 0a 20 20 20 20 73  (p->zIdx);.    s
377a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
377b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
377c0 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  e the linked lis
377d0 74 20 6f 66 20 49 64 78 54 61 62 6c 65 20 6f 62  t of IdxTable ob
377e0 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67 20 61  jects starting a
377f0 74 20 70 54 61 62 2e 0a 2a 2f 0a 73 74 61 74 69  t pTab..*/.stati
37800 63 20 76 6f 69 64 20 69 64 78 54 61 62 6c 65 46  c void idxTableF
37810 72 65 65 28 49 64 78 54 61 62 6c 65 20 2a 70 54  ree(IdxTable *pT
37820 61 62 29 7b 0a 20 20 49 64 78 54 61 62 6c 65 20  ab){.  IdxTable 
37830 2a 70 49 74 65 72 3b 0a 20 20 49 64 78 54 61 62  *pIter;.  IdxTab
37840 6c 65 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  le *pNext;.  for
37850 28 70 49 74 65 72 3d 70 54 61 62 3b 20 70 49 74  (pIter=pTab; pIt
37860 65 72 3b 20 70 49 74 65 72 3d 70 4e 65 78 74 29  er; pIter=pNext)
37870 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
37880 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ter->pNext;.    
37890 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
378a0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
378b0 2a 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65  * Free the linke
378c0 64 20 6c 69 73 74 20 6f 66 20 49 64 78 57 72 69  d list of IdxWri
378d0 74 65 20 6f 62 6a 65 63 74 73 20 73 74 61 72 74  te objects start
378e0 69 6e 67 20 61 74 20 70 54 61 62 2e 0a 2a 2f 0a  ing at pTab..*/.
378f0 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 78 57  static void idxW
37900 72 69 74 65 46 72 65 65 28 49 64 78 57 72 69 74  riteFree(IdxWrit
37910 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 64 78 57  e *pTab){.  IdxW
37920 72 69 74 65 20 2a 70 49 74 65 72 3b 0a 20 20 49  rite *pIter;.  I
37930 64 78 57 72 69 74 65 20 2a 70 4e 65 78 74 3b 0a  dxWrite *pNext;.
37940 20 20 66 6f 72 28 70 49 74 65 72 3d 70 54 61 62    for(pIter=pTab
37950 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
37960 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
37970 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 3b   = pIter->pNext;
37980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
37990 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
379a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
379b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
379c0 20 61 66 74 65 72 20 63 61 6e 64 69 64 61 74 65   after candidate
379d0 20 69 6e 64 65 78 65 73 20 68 61 76 65 20 62 65   indexes have be
379e0 65 6e 20 63 72 65 61 74 65 64 2e 20 49 74 0a 2a  en created. It.*
379f0 2a 20 72 75 6e 73 20 61 6c 6c 20 74 68 65 20 71  * runs all the q
37a00 75 65 72 69 65 73 20 74 6f 20 73 65 65 20 77 68  ueries to see wh
37a10 69 63 68 20 69 6e 64 65 78 65 73 20 74 68 65 79  ich indexes they
37a20 20 70 72 65 66 65 72 2c 20 61 6e 64 20 70 6f 70   prefer, and pop
37a30 75 6c 61 74 65 73 0a 2a 2a 20 49 64 78 53 74 61  ulates.** IdxSta
37a40 74 65 6d 65 6e 74 2e 7a 49 64 78 20 61 6e 64 20  tement.zIdx and 
37a50 49 64 78 53 74 61 74 65 6d 65 6e 74 2e 7a 45 51  IdxStatement.zEQ
37a60 50 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  P with the resul
37a70 74 73 2e 0a 2a 2f 0a 69 6e 74 20 69 64 78 46 69  ts..*/.int idxFi
37a80 6e 64 49 6e 64 65 78 65 73 28 0a 20 20 73 71 6c  ndIndexes(.  sql
37a90 69 74 65 33 65 78 70 65 72 74 20 2a 70 2c 0a 20  ite3expert *p,. 
37aa0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ac0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
37ad0 72 6f 72 20 6d 65 73 73 61 67 65 20 28 73 71 6c  ror message (sql
37ae0 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 2a 2f 0a  ite3_malloc) */.
37af0 29 7b 0a 20 20 49 64 78 53 74 61 74 65 6d 65 6e  ){.  IdxStatemen
37b00 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69  t *pStmt;.  sqli
37b10 74 65 33 20 2a 64 62 6d 20 3d 20 70 2d 3e 64 62  te3 *dbm = p->db
37b20 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
37b30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 49 64 78 48  LITE_OK;..  IdxH
37b40 61 73 68 20 68 49 64 78 3b 0a 20 20 69 64 78 48  ash hIdx;.  idxH
37b50 61 73 68 49 6e 69 74 28 26 68 49 64 78 29 3b 0a  ashInit(&hIdx);.
37b60 0a 20 20 66 6f 72 28 70 53 74 6d 74 3d 70 2d 3e  .  for(pStmt=p->
37b70 70 53 74 61 74 65 6d 65 6e 74 3b 20 72 63 3d 3d  pStatement; rc==
37b80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
37b90 6d 74 3b 20 70 53 74 6d 74 3d 70 53 74 6d 74 2d  mt; pStmt=pStmt-
37ba0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 64 78  >pNext){.    Idx
37bb0 48 61 73 68 45 6e 74 72 79 20 2a 70 45 6e 74 72  HashEntry *pEntr
37bc0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  y;.    sqlite3_s
37bd0 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20  tmt *pExplain = 
37be0 30 3b 0a 20 20 20 20 69 64 78 48 61 73 68 43 6c  0;.    idxHashCl
37bf0 65 61 72 28 26 68 49 64 78 29 3b 0a 20 20 20 20  ear(&hIdx);.    
37c00 72 63 20 3d 20 69 64 78 50 72 69 6e 74 66 50 72  rc = idxPrintfPr
37c10 65 70 61 72 65 53 74 6d 74 28 64 62 6d 2c 20 26  epareStmt(dbm, &
37c20 70 45 78 70 6c 61 69 6e 2c 20 70 7a 45 72 72 2c  pExplain, pzErr,
37c30 0a 20 20 20 20 20 20 20 20 22 45 58 50 4c 41 49  .        "EXPLAI
37c40 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22  N QUERY PLAN %s"
37c50 2c 20 70 53 74 6d 74 2d 3e 7a 53 71 6c 0a 20 20  , pStmt->zSql.  
37c60 20 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20    );.    while( 
37c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
37c80 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45   sqlite3_step(pE
37c90 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f  xplain)==SQLITE_
37ca0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ROW ){.      /* 
37cb0 69 6e 74 20 69 49 64 20 3d 20 73 71 6c 69 74 65  int iId = sqlite
37cc0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
37cd0 70 6c 61 69 6e 2c 20 30 29 3b 20 2a 2f 0a 20 20  plain, 0); */.  
37ce0 20 20 20 20 2f 2a 20 69 6e 74 20 69 50 61 72 65      /* int iPare
37cf0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  nt = sqlite3_col
37d00 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
37d10 2c 20 31 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f  , 1); */.      /
37d20 2a 20 69 6e 74 20 69 4e 6f 74 55 73 65 64 20 3d  * int iNotUsed =
37d30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
37d40 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29  int(pExplain, 2)
37d50 3b 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  ; */.      const
37d60 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d   char *zDetail =
37d70 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
37d80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
37d90 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a  t(pExplain, 3);.
37da0 20 20 20 20 20 20 69 6e 74 20 6e 44 65 74 61 69        int nDetai
37db0 6c 20 3d 20 53 54 52 4c 45 4e 28 7a 44 65 74 61  l = STRLEN(zDeta
37dc0 69 6c 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  il);.      int i
37dd0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ;..      for(i=0
37de0 3b 20 69 3c 6e 44 65 74 61 69 6c 3b 20 69 2b 2b  ; i<nDetail; i++
37df0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
37e00 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 30 3b   char *zIdx = 0;
37e10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
37e20 63 6d 70 28 26 7a 44 65 74 61 69 6c 5b 69 5d 2c  cmp(&zDetail[i],
37e30 20 22 20 55 53 49 4e 47 20 49 4e 44 45 58 20 22   " USING INDEX "
37e40 2c 20 31 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 13)==0 ){.    
37e50 20 20 20 20 20 20 7a 49 64 78 20 3d 20 26 7a 44        zIdx = &zD
37e60 65 74 61 69 6c 5b 69 2b 31 33 5d 3b 0a 20 20 20  etail[i+13];.   
37e70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
37e80 65 6d 63 6d 70 28 26 7a 44 65 74 61 69 6c 5b 69  emcmp(&zDetail[i
37e90 5d 2c 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52  ], " USING COVER
37ea0 49 4e 47 20 49 4e 44 45 58 20 22 2c 20 32 32 29  ING INDEX ", 22)
37eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
37ec0 20 7a 49 64 78 20 3d 20 26 7a 44 65 74 61 69 6c   zIdx = &zDetail
37ed0 5b 69 2b 32 32 5d 3b 0a 20 20 20 20 20 20 20 20  [i+22];.        
37ee0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49  }.        if( zI
37ef0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dx ){.          
37f00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
37f10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
37f20 6e 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nIdx = 0;.      
37f30 20 20 20 20 77 68 69 6c 65 28 20 7a 49 64 78 5b      while( zIdx[
37f40 6e 49 64 78 5d 21 3d 27 5c 30 27 20 26 26 20 28  nIdx]!='\0' && (
37f50 7a 49 64 78 5b 6e 49 64 78 5d 21 3d 27 20 27 20  zIdx[nIdx]!=' ' 
37f60 7c 7c 20 7a 49 64 78 5b 6e 49 64 78 2b 31 5d 21  || zIdx[nIdx+1]!
37f70 3d 27 28 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='(') ){.       
37f80 20 20 20 20 20 6e 49 64 78 2b 2b 3b 0a 20 20 20       nIdx++;.   
37f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37fa0 20 20 20 7a 53 71 6c 20 3d 20 69 64 78 48 61 73     zSql = idxHas
37fb0 68 53 65 61 72 63 68 28 26 70 2d 3e 68 49 64 78  hSearch(&p->hIdx
37fc0 2c 20 7a 49 64 78 2c 20 6e 49 64 78 29 3b 0a 20  , zIdx, nIdx);. 
37fd0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 71           if( zSq
37fe0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
37ff0 20 69 64 78 48 61 73 68 41 64 64 28 26 72 63 2c   idxHashAdd(&rc,
38000 20 26 68 49 64 78 2c 20 7a 53 71 6c 2c 20 30 29   &hIdx, zSql, 0)
38010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
38020 28 20 72 63 20 29 20 67 6f 74 6f 20 66 69 6e 64  ( rc ) goto find
38030 5f 69 6e 64 65 78 65 73 5f 6f 75 74 3b 0a 20 20  _indexes_out;.  
38040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
38060 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
38070 20 20 20 20 69 66 28 20 7a 44 65 74 61 69 6c 5b      if( zDetail[
38080 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
38090 20 20 20 70 53 74 6d 74 2d 3e 7a 45 51 50 20 3d     pStmt->zEQP =
380a0 20 69 64 78 41 70 70 65 6e 64 54 65 78 74 28 26   idxAppendText(&
380b0 72 63 2c 20 70 53 74 6d 74 2d 3e 7a 45 51 50 2c  rc, pStmt->zEQP,
380c0 20 22 25 73 5c 6e 22 2c 20 7a 44 65 74 61 69 6c   "%s\n", zDetail
380d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
380e0 0a 0a 20 20 20 20 66 6f 72 28 70 45 6e 74 72 79  ..    for(pEntry
380f0 3d 68 49 64 78 2e 70 46 69 72 73 74 3b 20 70 45  =hIdx.pFirst; pE
38100 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d 70 45 6e  ntry; pEntry=pEn
38110 74 72 79 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  try->pNext){.   
38120 20 20 20 70 53 74 6d 74 2d 3e 7a 49 64 78 20 3d     pStmt->zIdx =
38130 20 69 64 78 41 70 70 65 6e 64 54 65 78 74 28 26   idxAppendText(&
38140 72 63 2c 20 70 53 74 6d 74 2d 3e 7a 49 64 78 2c  rc, pStmt->zIdx,
38150 20 22 25 73 3b 5c 6e 22 2c 20 70 45 6e 74 72 79   "%s;\n", pEntry
38160 2d 3e 7a 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 0a  ->zKey);.    }..
38170 20 20 20 20 69 64 78 46 69 6e 61 6c 69 7a 65 28      idxFinalize(
38180 26 72 63 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a  &rc, pExplain);.
38190 20 20 7d 0a 0a 20 66 69 6e 64 5f 69 6e 64 65 78    }.. find_index
381a0 65 73 5f 6f 75 74 3a 0a 20 20 69 64 78 48 61 73  es_out:.  idxHas
381b0 68 43 6c 65 61 72 28 26 68 49 64 78 29 3b 0a 20  hClear(&hIdx);. 
381c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
381d0 74 61 74 69 63 20 69 6e 74 20 69 64 78 41 75 74  tatic int idxAut
381e0 68 43 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  hCallback(.  voi
381f0 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 65  d *pCtx,.  int e
38200 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Op,.  const char
38210 20 2a 7a 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *z3,.  const ch
38220 61 72 20 2a 7a 34 2c 0a 20 20 63 6f 6e 73 74 20  ar *z4,.  const 
38230 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 63 6f 6e  char *zDb,.  con
38240 73 74 20 63 68 61 72 20 2a 7a 54 72 69 67 67 65  st char *zTrigge
38250 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
38260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 28 76 6f  SQLITE_OK;.  (vo
38270 69 64 29 7a 34 3b 0a 20 20 28 76 6f 69 64 29 7a  id)z4;.  (void)z
38280 54 72 69 67 67 65 72 3b 0a 20 20 69 66 28 20 65  Trigger;.  if( e
38290 4f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 53 45 52  Op==SQLITE_INSER
382a0 54 20 7c 7c 20 65 4f 70 3d 3d 53 51 4c 49 54 45  T || eOp==SQLITE
382b0 5f 55 50 44 41 54 45 20 7c 7c 20 65 4f 70 3d 3d  _UPDATE || eOp==
382c0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 29 7b  SQLITE_DELETE ){
382d0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
382e0 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20 22 6d  _stricmp(zDb, "m
382f0 61 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ain")==0 ){.    
38300 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20    sqlite3expert 
38310 2a 70 20 3d 20 28 73 71 6c 69 74 65 33 65 78 70  *p = (sqlite3exp
38320 65 72 74 2a 29 70 43 74 78 3b 0a 20 20 20 20 20  ert*)pCtx;.     
38330 20 49 64 78 54 61 62 6c 65 20 2a 70 54 61 62 3b   IdxTable *pTab;
38340 0a 20 20 20 20 20 20 66 6f 72 28 70 54 61 62 3d  .      for(pTab=
38350 70 2d 3e 70 54 61 62 6c 65 3b 20 70 54 61 62 3b  p->pTable; pTab;
38360 20 70 54 61 62 3d 70 54 61 62