Blame README.md

Packit 87b942

SQLite Source Repository

Packit 87b942
Packit 87b942
This repository contains the complete source code for the SQLite database
Packit 87b942
engine.  Some test scripts are also included.  However, many other test scripts
Packit 87b942
and most of the documentation are managed separately.
Packit 87b942
Packit 87b942
If you are reading this on a Git mirror someplace, you are doing it wrong.
Packit 87b942
The [official repository](https://www.sqlite.org/src/) is better.  Go there
Packit 87b942
now.
Packit 87b942
Packit 87b942
## Obtaining The Code
Packit 87b942
Packit 87b942
SQLite sources are managed using the
Packit 87b942
[Fossil](https://www.fossil-scm.org/), a distributed version control system
Packit 87b942
that was specifically designed to support SQLite development.
Packit 87b942
If you do not want to use Fossil, you can download tarballs or ZIP
Packit 87b942
archives as follows:
Packit 87b942
Packit 87b942
  *  Lastest trunk check-in:
Packit 87b942
     <https://www.sqlite.org/src/tarball/sqlite.tar.gz> or
Packit 87b942
     <https://www.sqlite.org/src/zip/sqlite.zip>.
Packit 87b942
Packit 87b942
  *  Latest release:
Packit 87b942
     <https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release> or
Packit 87b942
     <https://www.sqlite.org/src/zip/sqlite.zip?r=release>.
Packit 87b942
Packit 87b942
  *  For other check-ins, substitute an appropriate branch name or
Packit 87b942
     tag or hash prefix for "release" in the URLs of the previous
Packit 87b942
     bullet.  Or browse the [timeline](https://www.sqlite.org/src/timeline)
Packit 87b942
     to locate the check-in desired, click on its information page link,
Packit 87b942
     then click on the "Tarball" or "ZIP Archive" links on the information
Packit 87b942
     page.
Packit 87b942
Packit 87b942
If you do want to use Fossil to check out the source tree, 
Packit 87b942
first install Fossil version 2.0 or later.
Packit 87b942
(Source tarballs and precompiled binaries available
Packit 87b942
[here](https://www.fossil-scm.org/fossil/uv/download.html).  Fossil is
Packit 87b942
a stand-alone program.  To install, simply download or build the single 
Packit 87b942
executable file and put that file someplace on your $PATH.)
Packit 87b942
Then run commands like this:
Packit 87b942
Packit 87b942
        mkdir ~/sqlite
Packit 87b942
        cd ~/sqlite
Packit 87b942
        fossil clone https://www.sqlite.org/src sqlite.fossil
Packit 87b942
        fossil open sqlite.fossil
Packit 87b942
    
Packit 87b942
After setting up a repository using the steps above, you can always
Packit 87b942
update to the lastest version using:
Packit 87b942
Packit 87b942
        fossil update trunk   ;# latest trunk check-in
Packit 87b942
        fossil update release ;# latest official release
Packit 87b942
Packit 87b942
Or type "fossil ui" to get a web-based user interface.
Packit 87b942
Packit 87b942
## Compiling
Packit 87b942
Packit 87b942
First create a directory in which to place
Packit 87b942
the build products.  It is recommended, but not required, that the
Packit 87b942
build directory be separate from the source directory.  Cd into the
Packit 87b942
build directory and then from the build directory run the configure
Packit 87b942
script found at the root of the source tree.  Then run "make".
Packit 87b942
Packit 87b942
For example:
Packit 87b942
Packit 87b942
        tar xzf sqlite.tar.gz    ;#  Unpack the source tree into "sqlite"
Packit 87b942
        mkdir bld                ;#  Build will occur in a sibling directory
Packit 87b942
        cd bld                   ;#  Change to the build directory
Packit 87b942
        ../sqlite/configure      ;#  Run the configure script
Packit 87b942
        make                     ;#  Run the makefile.
Packit 87b942
        make sqlite3.c           ;#  Build the "amalgamation" source file
Packit 87b942
        make test                ;#  Run some tests (requires Tcl)
Packit 87b942
Packit 87b942
See the makefile for additional targets.
Packit 87b942
Packit 87b942
The configure script uses autoconf 2.61 and libtool.  If the configure
Packit 87b942
script does not work out for you, there is a generic makefile named
Packit 87b942
"Makefile.linux-gcc" in the top directory of the source tree that you
Packit 87b942
can copy and edit to suit your needs.  Comments on the generic makefile
Packit 87b942
show what changes are needed.
Packit 87b942
Packit 87b942
## Using MSVC
Packit 87b942
Packit 87b942
On Windows, all applicable build products can be compiled with MSVC.
Packit 87b942
First open the command prompt window associated with the desired compiler
Packit 87b942
version (e.g. "Developer Command Prompt for VS2013").  Next, use NMAKE
Packit 87b942
with the provided "Makefile.msc" to build one of the supported targets.
Packit 87b942
Packit 87b942
For example:
Packit 87b942
Packit 87b942
        mkdir bld
Packit 87b942
        cd bld
Packit 87b942
        nmake /f Makefile.msc TOP=..\sqlite
Packit 87b942
        nmake /f Makefile.msc sqlite3.c TOP=..\sqlite
Packit 87b942
        nmake /f Makefile.msc sqlite3.dll TOP=..\sqlite
Packit 87b942
        nmake /f Makefile.msc sqlite3.exe TOP=..\sqlite
Packit 87b942
        nmake /f Makefile.msc test TOP=..\sqlite
Packit 87b942
Packit 87b942
There are several build options that can be set via the NMAKE command
Packit 87b942
line.  For example, to build for WinRT, simply add "FOR_WINRT=1" argument
Packit 87b942
to the "sqlite3.dll" command line above.  When debugging into the SQLite
Packit 87b942
code, adding the "DEBUG=1" argument to one of the above command lines is
Packit 87b942
recommended.
Packit 87b942
Packit 87b942
SQLite does not require [Tcl](http://www.tcl.tk/) to run, but a Tcl installation
Packit 87b942
is required by the makefiles (including those for MSVC).  SQLite contains
Packit 87b942
a lot of generated code and Tcl is used to do much of that code generation.
Packit 87b942
Packit 87b942
## Source Code Tour
Packit 87b942
Packit 87b942
Most of the core source files are in the **src/** subdirectory.  The
Packit 87b942
**src/** folder also contains files used to build the "testfixture" test
Packit 87b942
harness. The names of the source files used by "testfixture" all begin
Packit 87b942
with "test".
Packit 87b942
The **src/** also contains the "shell.c" file
Packit 87b942
which is the main program for the "sqlite3.exe"
Packit 87b942
[command-line shell](https://sqlite.org/cli.html) and
Packit 87b942
the "tclsqlite.c" file which implements the
Packit 87b942
[Tcl bindings](https://sqlite.org/tclsqlite.html) for SQLite.
Packit 87b942
(Historical note:  SQLite began as a Tcl
Packit 87b942
extension and only later escaped to the wild as an independent library.)
Packit 87b942
Packit 87b942
Test scripts and programs are found in the **test/** subdirectory.
Packit 87b942
Addtional test code is found in other source repositories.
Packit 87b942
See [How SQLite Is Tested](http://www.sqlite.org/testing.html) for
Packit 87b942
additional information.
Packit 87b942
Packit 87b942
The **ext/** subdirectory contains code for extensions.  The
Packit 87b942
Full-text search engine is in **ext/fts3**.  The R-Tree engine is in
Packit 87b942
**ext/rtree**.  The **ext/misc** subdirectory contains a number of
Packit 87b942
smaller, single-file extensions, such as a REGEXP operator.
Packit 87b942
Packit 87b942
The **tool/** subdirectory contains various scripts and programs used
Packit 87b942
for building generated source code files or for testing or for generating
Packit 87b942
accessory programs such as "sqlite3_analyzer(.exe)".
Packit 87b942
Packit 87b942
### Generated Source Code Files
Packit 87b942
Packit 87b942
Several of the C-language source files used by SQLite are generated from
Packit 87b942
other sources rather than being typed in manually by a programmer.  This
Packit 87b942
section will summarize those automatically-generated files.  To create all
Packit 87b942
of the automatically-generated files, simply run "make target_source".
Packit 87b942
The "target_source" make target will create a subdirectory "tsrc/" and
Packit 87b942
fill it with all the source files needed to build SQLite, both
Packit 87b942
manually-edited files and automatically-generated files.
Packit 87b942
Packit 87b942
The SQLite interface is defined by the **sqlite3.h** header file, which is
Packit 87b942
generated from src/sqlite.h.in, ./manifest.uuid, and ./VERSION.  The
Packit 87b942
[Tcl script](http://www.tcl.tk) at tool/mksqlite3h.tcl does the conversion.
Packit 87b942
The manifest.uuid file contains the SHA3 hash of the particular check-in
Packit 87b942
and is used to generate the SQLITE\_SOURCE\_ID macro.  The VERSION file
Packit 87b942
contains the current SQLite version number.  The sqlite3.h header is really
Packit 87b942
just a copy of src/sqlite.h.in with the source-id and version number inserted
Packit 87b942
at just the right spots. Note that comment text in the sqlite3.h file is
Packit 87b942
used to generate much of the SQLite API documentation.  The Tcl scripts
Packit 87b942
used to generate that documentation are in a separate source repository.
Packit 87b942
Packit 87b942
The SQL language parser is **parse.c** which is generate from a grammar in
Packit 87b942
the src/parse.y file.  The conversion of "parse.y" into "parse.c" is done
Packit 87b942
by the [lemon](./doc/lemon.html) LALR(1) parser generator.  The source code
Packit 87b942
for lemon is at tool/lemon.c.  Lemon uses the tool/lempar.c file as a
Packit 87b942
template for generating its parser.
Packit 87b942
Packit 87b942
Lemon also generates the **parse.h** header file, at the same time it
Packit 87b942
generates parse.c. But the parse.h header file is
Packit 87b942
modified further (to add additional symbols) using the ./addopcodes.tcl
Packit 87b942
Tcl script.
Packit 87b942
Packit 87b942
The **opcodes.h** header file contains macros that define the numbers
Packit 87b942
corresponding to opcodes in the "VDBE" virtual machine.  The opcodes.h
Packit 87b942
file is generated by the scanning the src/vdbe.c source file.  The
Packit 87b942
Tcl script at ./mkopcodeh.tcl does this scan and generates opcodes.h.
Packit 87b942
A second Tcl script, ./mkopcodec.tcl, then scans opcodes.h to generate
Packit 87b942
the **opcodes.c** source file, which contains a reverse mapping from
Packit 87b942
opcode-number to opcode-name that is used for EXPLAIN output.
Packit 87b942
Packit 87b942
The **keywordhash.h** header file contains the definition of a hash table
Packit 87b942
that maps SQL language keywords (ex: "CREATE", "SELECT", "INDEX", etc.) into
Packit 87b942
the numeric codes used by the parse.c parser.  The keywordhash.h file is
Packit 87b942
generated by a C-language program at tool mkkeywordhash.c.
Packit 87b942
Packit 87b942
The **pragma.h** header file contains various definitions used to parse
Packit 87b942
and implement the PRAGMA statements.  The header is generated by a
Packit 87b942
script **tool/mkpragmatab.tcl**. If you want to add a new PRAGMA, edit
Packit 87b942
the **tool/mkpragmatab.tcl** file to insert the information needed by the
Packit 87b942
parser for your new PRAGMA, then run the script to regenerate the
Packit 87b942
**pragma.h** header file.
Packit 87b942
Packit 87b942
### The Amalgamation
Packit 87b942
Packit 87b942
All of the individual C source code and header files (both manually-edited
Packit 87b942
and automatically-generated) can be combined into a single big source file
Packit 87b942
**sqlite3.c** called "the amalgamation".  The amalgamation is the recommended
Packit 87b942
way of using SQLite in a larger application.  Combining all individual
Packit 87b942
source code files into a single big source code file allows the C compiler
Packit 87b942
to perform more cross-procedure analysis and generate better code.  SQLite
Packit 87b942
runs about 5% faster when compiled from the amalgamation versus when compiled
Packit 87b942
from individual source files.
Packit 87b942
Packit 87b942
The amalgamation is generated from the tool/mksqlite3c.tcl Tcl script.
Packit 87b942
First, all of the individual source files must be gathered into the tsrc/
Packit 87b942
subdirectory (using the equivalent of "make target_source") then the
Packit 87b942
tool/mksqlite3c.tcl script is run to copy them all together in just the
Packit 87b942
right order while resolving internal "#include" references.
Packit 87b942
Packit 87b942
The amalgamation source file is more than 200K lines long.  Some symbolic
Packit 87b942
debuggers (most notably MSVC) are unable to deal with files longer than 64K
Packit 87b942
lines.  To work around this, a separate Tcl script, tool/split-sqlite3c.tcl,
Packit 87b942
can be run on the amalgamation to break it up into a single small C file
Packit 87b942
called **sqlite3-all.c** that does #include on about seven other files
Packit 87b942
named **sqlite3-1.c**, **sqlite3-2.c**, ..., **sqlite3-7.c**.  In this way,
Packit 87b942
all of the source code is contained within a single translation unit so
Packit 87b942
that the compiler can do extra cross-procedure optimization, but no
Packit 87b942
individual source file exceeds 32K lines in length.
Packit 87b942
Packit 87b942
## How It All Fits Together
Packit 87b942
Packit 87b942
SQLite is modular in design.
Packit 87b942
See the [architectural description](http://www.sqlite.org/arch.html)
Packit 87b942
for details. Other documents that are useful in
Packit 87b942
(helping to understand how SQLite works include the
Packit 87b942
[file format](http://www.sqlite.org/fileformat2.html) description,
Packit 87b942
the [virtual machine](http://www.sqlite.org/opcode.html) that runs
Packit 87b942
prepared statements, the description of
Packit 87b942
[how transactions work](http://www.sqlite.org/atomiccommit.html), and
Packit 87b942
the [overview of the query planner](http://www.sqlite.org/optoverview.html).
Packit 87b942
Packit 87b942
Years of effort have gone into optimizating SQLite, both
Packit 87b942
for small size and high performance.  And optimizations tend to result in
Packit 87b942
complex code.  So there is a lot of complexity in the current SQLite
Packit 87b942
implementation.  It will not be the easiest library in the world to hack.
Packit 87b942
Packit 87b942
Key files:
Packit 87b942
Packit 87b942
  *  **sqlite.h.in** - This file defines the public interface to the SQLite
Packit 87b942
     library.  Readers will need to be familiar with this interface before
Packit 87b942
     trying to understand how the library works internally.
Packit 87b942
Packit 87b942
  *  **sqliteInt.h** - this header file defines many of the data objects
Packit 87b942
     used internally by SQLite.  In addition to "sqliteInt.h", some
Packit 87b942
     subsystems have their own header files.
Packit 87b942
Packit 87b942
  *  **parse.y** - This file describes the LALR(1) grammar that SQLite uses
Packit 87b942
     to parse SQL statements, and the actions that are taken at each step
Packit 87b942
     in the parsing process.
Packit 87b942
Packit 87b942
  *  **vdbe.c** - This file implements the virtual machine that runs
Packit 87b942
     prepared statements.  There are various helper files whose names
Packit 87b942
     begin with "vdbe".  The VDBE has access to the vdbeInt.h header file
Packit 87b942
     which defines internal data objects.  The rest of SQLite interacts
Packit 87b942
     with the VDBE through an interface defined by vdbe.h.
Packit 87b942
Packit 87b942
  *  **where.c** - This file (together with its helper files named
Packit 87b942
     by "where*.c") analyzes the WHERE clause and generates
Packit 87b942
     virtual machine code to run queries efficiently.  This file is
Packit 87b942
     sometimes called the "query optimizer".  It has its own private
Packit 87b942
     header file, whereInt.h, that defines data objects used internally.
Packit 87b942
Packit 87b942
  *  **btree.c** - This file contains the implementation of the B-Tree
Packit 87b942
     storage engine used by SQLite.  The interface to the rest of the system
Packit 87b942
     is defined by "btree.h".  The "btreeInt.h" header defines objects
Packit 87b942
     used internally by btree.c and not published to the rest of the system.
Packit 87b942
Packit 87b942
  *  **pager.c** - This file contains the "pager" implementation, the
Packit 87b942
     module that implements transactions.  The "pager.h" header file
Packit 87b942
     defines the interface between pager.c and the rest of the system.
Packit 87b942
Packit 87b942
  *  **os_unix.c** and **os_win.c** - These two files implement the interface
Packit 87b942
     between SQLite and the underlying operating system using the run-time
Packit 87b942
     pluggable VFS interface.
Packit 87b942
Packit 87b942
  *  **shell.c.in** - This file is not part of the core SQLite library.  This
Packit 87b942
     is the file that, when linked against sqlite3.a, generates the
Packit 87b942
     "sqlite3.exe" command-line shell.  The "shell.c.in" file is transformed
Packit 87b942
     into "shell.c" as part of the build process.
Packit 87b942
Packit 87b942
  *  **tclsqlite.c** - This file implements the Tcl bindings for SQLite.  It
Packit 87b942
     is not part of the core SQLite library.  But as most of the tests in this
Packit 87b942
     repository are written in Tcl, the Tcl language bindings are important.
Packit 87b942
Packit 87b942
  *  **test*.c** - Files in the src/ folder that begin with "test" go into
Packit 87b942
     building the "testfixture.exe" program.  The testfixture.exe program is
Packit 87b942
     an enhanced Tcl shell.  The testfixture.exe program runs scripts in the
Packit 87b942
     test/ folder to validate the core SQLite code.  The testfixture program
Packit 87b942
     (and some other test programs too) is build and run when you type
Packit 87b942
     "make test".
Packit 87b942
Packit 87b942
  *  **ext/misc/json1.c** - This file implements the various JSON functions
Packit 87b942
     that are build into SQLite.
Packit 87b942
Packit 87b942
There are many other source files.  Each has a succinct header comment that
Packit 87b942
describes its purpose and role within the larger system.
Packit 87b942
Packit 87b942
Packit 87b942
## Contacts
Packit 87b942
Packit 87b942
The main SQLite webpage is [http://www.sqlite.org/](http://www.sqlite.org/)
Packit 87b942
with geographically distributed backups at
Packit 87b942
[http://www2.sqlite.org/](http://www2.sqlite.org) and
Packit 87b942
[http://www3.sqlite.org/](http://www3.sqlite.org).