summaryrefslogtreecommitdiffstats
path: root/www/amalgamation.html
diff options
context:
space:
mode:
Diffstat (limited to 'www/amalgamation.html')
-rw-r--r--www/amalgamation.html289
1 files changed, 289 insertions, 0 deletions
diff --git a/www/amalgamation.html b/www/amalgamation.html
new file mode 100644
index 0000000..777232f
--- /dev/null
+++ b/www/amalgamation.html
@@ -0,0 +1,289 @@
+<!DOCTYPE html>
+<html><head>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+<link href="sqlite.css" rel="stylesheet">
+<title>The SQLite Amalgamation</title>
+<!-- path= -->
+</head>
+<body>
+<div class=nosearch>
+<a href="index.html">
+<img class="logo" src="images/sqlite370_banner.gif" alt="SQLite" border="0">
+</a>
+<div><!-- IE hack to prevent disappearing logo --></div>
+<div class="tagline desktoponly">
+Small. Fast. Reliable.<br>Choose any three.
+</div>
+<div class="menu mainmenu">
+<ul>
+<li><a href="index.html">Home</a>
+<li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
+<li class='wideonly'><a href='about.html'>About</a>
+<li class='desktoponly'><a href="docs.html">Documentation</a>
+<li class='desktoponly'><a href="download.html">Download</a>
+<li class='wideonly'><a href='copyright.html'>License</a>
+<li class='desktoponly'><a href="support.html">Support</a>
+<li class='desktoponly'><a href="prosupport.html">Purchase</a>
+<li class='search' id='search_menubutton'>
+<a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
+</ul>
+</div>
+<div class="menu submenu" id="submenu">
+<ul>
+<li><a href='about.html'>About</a>
+<li><a href='docs.html'>Documentation</a>
+<li><a href='download.html'>Download</a>
+<li><a href='support.html'>Support</a>
+<li><a href='prosupport.html'>Purchase</a>
+</ul>
+</div>
+<div class="searchmenu" id="searchmenu">
+<form method="GET" action="search">
+<select name="s" id="searchtype">
+<option value="d">Search Documentation</option>
+<option value="c">Search Changelog</option>
+</select>
+<input type="text" name="q" id="searchbox" value="">
+<input type="submit" value="Go">
+</form>
+</div>
+</div>
+<script>
+function toggle_div(nm) {
+var w = document.getElementById(nm);
+if( w.style.display=="block" ){
+w.style.display = "none";
+}else{
+w.style.display = "block";
+}
+}
+function toggle_search() {
+var w = document.getElementById("searchmenu");
+if( w.style.display=="block" ){
+w.style.display = "none";
+} else {
+w.style.display = "block";
+setTimeout(function(){
+document.getElementById("searchbox").focus()
+}, 30);
+}
+}
+function div_off(nm){document.getElementById(nm).style.display="none";}
+window.onbeforeunload = function(e){div_off("submenu");}
+/* Disable the Search feature if we are not operating from CGI, since */
+/* Search is accomplished using CGI and will not work without it. */
+if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
+document.getElementById("search_menubutton").style.display = "none";
+}
+/* Used by the Hide/Show button beside syntax diagrams, to toggle the */
+function hideorshow(btn,obj){
+var x = document.getElementById(obj);
+var b = document.getElementById(btn);
+if( x.style.display!='none' ){
+x.style.display = 'none';
+b.innerHTML='show';
+}else{
+x.style.display = '';
+b.innerHTML='hide';
+}
+return false;
+}
+var antiRobot = 0;
+function antiRobotGo(){
+if( antiRobot!=3 ) return;
+antiRobot = 7;
+var j = document.getElementById("mtimelink");
+if(j && j.hasAttribute("data-href")) j.href=j.getAttribute("data-href");
+}
+function antiRobotDefense(){
+document.body.onmousedown=function(){
+antiRobot |= 2;
+antiRobotGo();
+document.body.onmousedown=null;
+}
+document.body.onmousemove=function(){
+antiRobot |= 2;
+antiRobotGo();
+document.body.onmousemove=null;
+}
+setTimeout(function(){
+antiRobot |= 1;
+antiRobotGo();
+}, 100)
+antiRobotGo();
+}
+antiRobotDefense();
+</script>
+<div class=fancy>
+<div class=nosearch>
+<div class="fancy_title">
+The SQLite Amalgamation
+</div>
+</div>
+
+
+
+
+
+<h1 id="executive_summary"><span>1. </span>Executive Summary</h1>
+
+<p>Over 100 separate source files are concatenated into a
+single large file of C-code named "sqlite3.c" and
+referred to as "the amalgamation". The amalgamation
+contains everything an application needs to embed SQLite.
+
+</p><p>Combining all the code for SQLite into one big file makes SQLite
+easier to deploy &mdash; there is just one file to keep track of.
+And because all code is in
+a single translation unit, compilers can do
+better inter-procedure and inlining optimization
+resulting in machine code that is between 5% and 10% faster.
+
+</p><h1 id="the_sqlite_amalgamation"><span>2. </span>The SQLite Amalgamation</h1>
+
+<p>The SQLite library consists of 111 files of C code
+(as of <a href="releaselog/3_37_0.html">Version 3.37.0</a> - 2021-11-27)
+in the core with 22 additional files that
+implement certain commonly used extensions.
+
+Of the 133
+main source files, about 75% are C code and about 25% are C header files.
+Most of these are "source" files in the sense that they are stored
+in the <a href="https://www.sqlite.org/src">SQLite version control system</a>
+and are edited manually in an ordinary text editor.
+But some of the C-language files are generated using scripts
+or auxiliary programs. For example, the
+<a href="https://www.sqlite.org/src/artifact?ci=trunk&filename=src/parse.y">parse.y</a>
+file contains an LALR(1) grammar of the SQL language which is compiled,
+by the <a href="lemon.html">Lemon parser generator</a>, to produce a parser contained in the file
+"parse.c" accompanied by token identifiers in "parse.h".
+</p>
+
+<p>The makefiles for SQLite have an "sqlite3.c" target for building the
+amalgamation, to contain all C code for the core SQLite library and the
+<a href="fts3.html">FTS3</a>, <a href="fts5.html">FTS5</a>, <a href="rtree.html">RTREE</a>, <a href="dbstat.html">DBSTAT</a>, <a href="json1.html">JSON1</a>,
+<a href="rbu.html">RBU</a> and <a href="sessionintro.html">SESSION</a>
+extensions.
+This file contains about 238K lines of code
+(or 145K if you omit blank lines and comments) and is over 8.4 megabytes
+in size (as of 2021-12-29).
+
+</p><p>Though the various extensions are included in the
+"sqlite3.c" amalgamation file, they are disabled using #ifdef statements.
+Activate the extensions using <a href="compile.html">compile-time options</a> like:
+
+</p><ul>
+<li> <a href="compile.html#enable_fts3">-DSQLITE_ENABLE_FTS3</a>
+</li><li> <a href="compile.html#enable_fts5">-DSQLITE_ENABLE_FTS5</a>
+</li><li> <a href="compile.html#enable_rtree">-DSQLITE_ENABLE_RTREE</a>
+</li><li> <a href="compile.html#enable_dbstat_vtab">-DSQLITE_ENABLE_DBSTAT_VTAB</a>
+</li><li> <a href="compile.html#enable_rbu">-DSQLITE_ENABLE_RBU</a>
+</li><li> <a href="compile.html#enable_session">-DSQLITE_ENABLE_SESSION</a>
+</li></ul>
+
+<p>The amalgamation contains everything you need to integrate SQLite
+into a larger project. Just copy the amalgamation into your source
+directory and compile it along with the other C code files in your project.
+(A <a href="howtocompile.html">more detailed discussion</a> of the compilation process is
+available.)
+You may also want to make use of the "sqlite3.h" header file that
+defines the programming API for SQLite.
+The sqlite3.h header file is available separately.
+The sqlite3.h file is also contained within the amalgamation, in
+the first few thousand lines. So if you have a copy of
+sqlite3.c but cannot seem to locate sqlite3.h, you can always
+regenerate the sqlite3.h by copying and pasting from the amalgamation.</p>
+
+<p>In addition to making SQLite easier to incorporate into other
+projects, the amalgamation also makes it run faster. Many
+compilers are able to do additional optimizations on code when
+it is contained with in a single translation unit such as it
+is in the amalgamation. We have measured performance improvements
+of between 5 and 10% when we use the amalgamation to compile
+SQLite rather than individual source files. The downside of this
+is that the additional optimizations often take the form of
+function inlining which tends to make the size of the resulting
+binary image larger.</p>
+
+<a name="amal32k"></a>
+
+<h1 id="the_split_amalgamation"><span>3. </span>The Split Amalgamation</h1>
+
+<p>Developers sometimes experience trouble debugging the
+quarter-million line amalgamation source file because some debuggers
+are only able to handle source code line numbers less than 32,768.
+The amalgamation source code runs fine. One just cannot single-step
+through it in a debugger.
+
+</p><p>To circumvent this limitation, the amalgamation is also available in
+a split form, consisting of files "sqlite3-1.c", "sqlite3-2.c", and
+so forth, where each file is less than 32,768 lines in length and
+where the concatenation of the files contain all of the code for the
+complete amalgamation. Then there is a separate source file named
+"sqlite3-all.c" which basically consists of code like this:
+
+</p><div class="codeblock"><pre>#include "sqlite3-1.c"
+#include "sqlite3-2.c"
+#include "sqlite3-3.c"
+#include "sqlite3-4.c"
+#include "sqlite3-5.c"
+#include "sqlite3-6.c"
+#include "sqlite3-7.c"
+</pre></div>
+
+<p>Applications using the split amalgamation simply compile against
+"sqlite3-all.c" instead of "sqlite3.c". The two files work exactly
+the same. But with "sqlite3-all.c", no single source file contains more
+than 32,767 lines of code, and so it is more convenient to use some
+debuggers. The downside of the split amalgamation is that it consists
+of 6 C source code files instead of just 1.
+
+<a name="amalgtarball"></a>
+
+</p><h1 id="download_copies_of_the_precompiled_amalgamation"><span>4. </span>Download Copies Of The Precompiled Amalgamation</h1>
+
+<p>The amalgamation and
+the sqlite3.h header file are available on
+the <a href="download.html">download page</a> as a file
+named sqlite-amalgamation-X.zip
+where the X is replaced by the appropriate version number.</p>
+
+<a name="amalgbuild"></a>
+
+<h1 id="building_the_amalgamation_from_canonical_source_code"><span>5. </span>Building The Amalgamation From Canonical Source Code</h1>
+
+<p>To build the amalgamation (either the full amalgamation or the
+split amalgamation), first
+<a href="getthecode.html">get the canonical source code</a> from one of the three servers.
+Then, on both unix-like systems and on Windows systems that have the
+free <a href="http://mingw.org/wiki/msys">MinGW</a> development environment
+installed, the amalgamation can be built using the
+following commands:
+
+</p><div class="codeblock"><pre>sh configure
+make sqlite3.c
+</pre></div>
+
+<p>To build using Microsoft Visual C++, run this command:
+
+</p><div class="codeblock"><pre>nmake /f makefile.msc sqlite3.c
+</pre></div>
+
+<p>In both cases, the split amalgamation can be obtained by
+substituting "sqlite3-all.c" for "sqlite3.c" as the make target.
+
+</p><h2 id="dependencies"><span>5.1. </span>Dependencies</h2>
+
+<p>The build process makes extensive use of the
+<a href="http://www.tcl-lang.org/">Tcl</a> scripting language. You will need to have a
+copy of TCL installed in order for the make targets above to work.
+Easy-to-use installers can be obtained from <a href="http://www.tcl-lang.org/">http://www.tcl-lang.org/</a>.
+Many unix workstations have Tcl installed by default.
+
+</p><h2 id="see_also"><span>5.2. </span>See Also</h2>
+
+<p>Additional notes on compiling SQLite can be found on the
+<a href="howtocompile.html">How To Compile SQLite</a> page.
+</p>
+