264 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!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;
 | |
| }
 | |
| </script>
 | |
| </div>
 | |
| <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 files of C-code named "sqlite3.c" and
 | |
| called "the amalgamation". The amalgamation
 | |
| contains everything an application needs to embed SQLite.
 | |
| The amalgamation file is more than 220,000 lines long and over 7.5
 | |
| megabytes in size (as of 2018-11-24).
 | |
| 
 | |
| </p><p>Combining all the code for SQLite into one big file makes SQLite
 | |
| easier to deploy — 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
 | |
| 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 102 files of C code
 | |
| (as of <a href="releaselog/3_9_0.html">Version 3.9.0</a> - 2015-10-14)
 | |
| in the core with 32 additional files that
 | |
| implement 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>, and
 | |
| <a href="rbu.html">RBU</a> extensions.
 | |
| Of the 102 
 | |
| 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
 | |
| down into are parser in files "parse.c" and "parse.h" by the
 | |
| <a href="lemon.html">Lemon parser generator</a>.
 | |
| </p>
 | |
| 
 | |
| <p>The makefiles for SQLite have an "sqlite3.c" target for building the
 | |
| file we call "the amalgamation".
 | |
| The amalgamation is a single C code file, named "sqlite3.c",
 | |
| that contains 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>, and <a href="rbu.html">RBU</a> extensions.
 | |
| This file contains about 184K lines of code 
 | |
| (113K if you omit blank lines and comments) and is over 6.4 megabytes
 | |
| in size.
 | |
| 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_json1">-DSQLITE_ENABLE_JSON1</a>
 | |
| </li><li> <a href="compile.html#enable_rbu">-DSQLITE_ENABLE_RBU</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
 | |
| 185,000-line-long 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.
 | |
| 
 | |
| </p><h1 id="download_copies_of_the_amalgamation"><span>4. </span>Download Copies Of The 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>
 |