Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | :-) (CVS 91) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
d573b431ed766db2d38672334a0c81fa |
User & Date: | drh 2000-06-09 14:14:33.000 |
Context
2000-06-11
| ||
23:50 | added the fcnt() function for testing (CVS 92) (check-in: 0f93c27cdd user: drh tags: trunk) | |
2000-06-09
| ||
14:14 | :-) (CVS 91) (check-in: d573b431ed user: drh tags: trunk) | |
03:52 | :-) (CVS 90) (check-in: aba926bb33 user: drh tags: trunk) | |
Changes
Changes to Makefile.in.
︙ | ︙ | |||
190 191 192 193 194 195 196 | arch.html: $(TOP)/www/arch.tcl tclsh $(TOP)/www/arch.tcl >arch.html arch.png: $(TOP)/www/arch.png cp $(TOP)/www/arch.png . | | | 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | arch.html: $(TOP)/www/arch.tcl tclsh $(TOP)/www/arch.tcl >arch.html arch.png: $(TOP)/www/arch.png cp $(TOP)/www/arch.png . opcode.html: $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c tclsh $(TOP)/www/opcode.tcl $(TOP)/src/vdbe.c >opcode.html # Files to be published on the website. # PUBLISH = \ sqlite.tar.gz \ |
︙ | ︙ |
Changes to src/parse.y.
︙ | ︙ | |||
22 23 24 25 26 27 28 | ** ************************************************************************* ** This file contains SQLite's grammar for SQL. Process this file ** using the lemon parser generator to generate C code that runs ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | ** ************************************************************************* ** This file contains SQLite's grammar for SQL. Process this file ** using the lemon parser generator to generate C code that runs ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** ** @(#) $Id: parse.y,v 1.20 2000/06/09 14:14:33 drh Exp $ */ %token_prefix TK_ %token_type {Token} %extra_argument {Parse *pParse} %syntax_error { sqliteSetString(&pParse->zErrMsg,"syntax error",0); pParse->sErrToken = TOKEN; |
︙ | ︙ | |||
292 293 294 295 296 297 298 | %left OR. %left AND. %right NOT. %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN. %left GT GE LT LE. %left PLUS MINUS. | | | 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 | %left OR. %left AND. %right NOT. %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN. %left GT GE LT LE. %left PLUS MINUS. %left STAR SLASH. %right UMINUS. %type expr {Expr*} %destructor expr {sqliteExprDelete($$);} expr(A) ::= LP expr(X) RP. {A = X;} expr(A) ::= ID(X). {A = sqliteExpr(TK_ID, 0, 0, &X);} |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
37 38 39 40 41 42 43 | ** inplicit conversion from one type to the other occurs as necessary. ** ** Most of the code in this file is taken up by the sqliteVdbeExec() ** function which does the work of interpreting a VDBE program. ** But other routines are also provided to help in building up ** a program instruction by instruction. ** | | | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | ** inplicit conversion from one type to the other occurs as necessary. ** ** Most of the code in this file is taken up by the sqliteVdbeExec() ** function which does the work of interpreting a VDBE program. ** But other routines are also provided to help in building up ** a program instruction by instruction. ** ** $Id: vdbe.c,v 1.32 2000/06/09 14:14:34 drh Exp $ */ #include "sqliteInt.h" #include <unistd.h> /* ** SQL is translated into a sequence of instructions to be ** executed by a virtual machine. Each instruction is an instance |
︙ | ︙ | |||
1671 1672 1673 1674 1675 1676 1677 | p->aStack[p->tos].flags = STK_Str|STK_Dyn; p->zStack[p->tos] = zNewKey; break; } /* Opcode: Open P1 P2 P3 ** | | > | > | | > | 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 | p->aStack[p->tos].flags = STK_Str|STK_Dyn; p->zStack[p->tos] = zNewKey; break; } /* Opcode: Open P1 P2 P3 ** ** Open a new cursor for the database table named P3. Give the ** cursor an identifier P1. ** Open readonly if P2==0 and for reading and writing if P2!=0. ** The table is created if it does not already exist and P2!=0. ** If there is already another cursor opened with identifier P1, ** then the old cursor is closed first. ** All cursors are automatically closed when ** the VDBE finishes execution. The P1 values need not be ** contiguous but all P1 values should be small integers. It is ** an error for P1 to be negative. ** ** If P3 is null or an empty string, a temporary table created. ** This table is automatically deleted when the cursor is closed. */ case OP_Open: { int i = pOp->p1; if( i<0 ) goto bad_instruction; if( i>=p->nTable ){ int j; p->aTab = sqliteRealloc( p->aTab, (i+1)*sizeof(VdbeTable) ); |
︙ | ︙ | |||
1738 1739 1740 1741 1742 1743 1744 | } /* Opcode: Fetch P1 * * ** ** Pop the top of the stack and use its value as a key to fetch ** a record from database table or index P1. The data is held ** in the P1 cursor until needed. The data is not pushed onto the | | | 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 | } /* Opcode: Fetch P1 * * ** ** Pop the top of the stack and use its value as a key to fetch ** a record from database table or index P1. The data is held ** in the P1 cursor until needed. The data is not pushed onto the ** stack. */ case OP_Fetch: { int i = pOp->p1; int tos = p->tos; if( tos<0 ) goto not_enough_stack; if( i>=0 && i<p->nTable && p->aTab[i].pTable ){ if( p->aStack[tos].flags & STK_Int ){ |
︙ | ︙ | |||
1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 | /* Opcode: Distinct P1 P2 * ** ** Use the top of the stack as a key. If a record with that key ** does not exist in table P1, then jump to P2. If the record ** does already exist, then fall thru. The record is not retrieved. ** The key is not popped from the stack. */ /* Opcode: Found P1 P2 * ** ** Use the top of the stack as a key. If a record with that key ** does exist in table P1, then jump to P2. If the record ** does not exist, then fall thru. The record is not retrieved. ** The key is popped from the stack. */ /* Opcode: NotFound P1 P2 * ** ** Use the top of the stack as a key. If a record with that key | > > > | | > > > | 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 | /* Opcode: Distinct P1 P2 * ** ** Use the top of the stack as a key. If a record with that key ** does not exist in table P1, then jump to P2. If the record ** does already exist, then fall thru. The record is not retrieved. ** The key is not popped from the stack. ** ** This operation is similar to NotFound except that this operation ** does not pop the key from the stack. */ /* Opcode: Found P1 P2 * ** ** Use the top of the stack as a key. If a record with that key ** does exist in table P1, then jump to P2. If the record ** does not exist, then fall thru. The record is not retrieved. ** The key is popped from the stack. */ /* Opcode: NotFound P1 P2 * ** ** Use the top of the stack as a key. If a record with that key ** does not exist in table P1, then jump to P2. If the record ** does exist, then fall thru. The record is not retrieved. ** The key is popped from the stack. ** ** The difference between this operation and Distinct is that ** Distinct does not pop the key from the stack. */ case OP_Distinct: case OP_NotFound: case OP_Found: { int i = pOp->p1; int tos = p->tos; int alreadyExists = 0; |
︙ | ︙ | |||
1907 1908 1909 1910 1911 1912 1913 | ** ** Push onto the stack the value of the P2-th field from the ** most recent Fetch from table P1. ** ** The value pushed is just a pointer to the data in the cursor. ** The value will go away the next time a record is fetched from P1, ** or when P1 is closed. Make a copy of the string (using | | | 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 | ** ** Push onto the stack the value of the P2-th field from the ** most recent Fetch from table P1. ** ** The value pushed is just a pointer to the data in the cursor. ** The value will go away the next time a record is fetched from P1, ** or when P1 is closed. Make a copy of the string (using ** "Concat 1 0 0") if it needs to persist longer than that. ** ** If the KeyAsData opcode has previously executed on this cursor, ** then the field might be extracted from the key rather than the ** data. */ case OP_Field: { int *pAddr; |
︙ | ︙ | |||
2061 2062 2063 2064 2065 2066 2067 | p->aTab[i].index = j+1; } break; } /* Opcode: PutIdx P1 * * ** | | | 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 | p->aTab[i].index = j+1; } break; } /* Opcode: PutIdx P1 * * ** ** The top of the stack hold an index key (probably made using the ** MakeKey instruction) and next on stack holds an index value for ** a table. Locate the record in the index P1 that has the key ** and insert the index value into its ** data. Write the results back to the index. ** If the key doesn't exist it is created. */ case OP_PutIdx: { |
︙ | ︙ | |||
2522 2523 2524 2525 2526 2527 2528 | } break; } /* Opcode: FileOpen * * P3 ** ** Open the file named by P3 for reading using the FileRead opcode. | | | 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 | } break; } /* Opcode: FileOpen * * P3 ** ** Open the file named by P3 for reading using the FileRead opcode. ** If P3 is "stdin" then open standard input for reading. */ case OP_FileOpen: { if( pOp->p3==0 ) goto bad_instruction; if( p->pFile ){ if( p->pFile!=stdin ) fclose(p->pFile); p->pFile = 0; } |
︙ | ︙ | |||
2568 2569 2570 2571 2572 2573 2574 | } p->nLineAlloc = 0; break; } /* Opcode: FileRead P1 P2 P3 ** | | | | > > | 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 | } p->nLineAlloc = 0; break; } /* Opcode: FileRead P1 P2 P3 ** ** Read a single line of input from the open file (the file opened using ** FileOpen). If we reach end-of-file, jump immediately to P2. If ** we are able to get another line, split the line apart using P3 as ** a delimiter. There should be P1 fields. If the input line contains ** more than P1 fields, ignore the excess. If the input line contains ** fewer than P1 fields, assume the remaining fields contain an ** empty string. */ case OP_FileRead: { int n, eol, nField, i, c, nDelim; char *zDelim, *z; if( p->pFile==0 ) goto fileread_jump; nField = pOp->p1; if( nField<=0 ) goto fileread_jump; |
︙ | ︙ |
Changes to www/arch.fig.
︙ | ︙ | |||
36 37 38 39 40 41 42 | 3675 8925 3675 9450 4 1 0 100 0 0 20 0.0000 4 195 1920 3675 8025 Virtual Machine\001 4 1 0 100 0 0 20 0.0000 4 195 1830 3675 6225 Code Generator\001 4 1 0 100 0 0 20 0.0000 4 195 735 3675 4350 Parser\001 4 1 0 100 0 0 20 0.0000 4 195 1140 3675 2550 Tokenizer\001 4 1 0 100 0 0 20 0.0000 4 195 1020 3675 750 Interface\001 4 1 0 100 0 0 20 0.0000 4 195 990 3675 9825 Backend\001 | | | | | | | | > | 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 3675 8925 3675 9450 4 1 0 100 0 0 20 0.0000 4 195 1920 3675 8025 Virtual Machine\001 4 1 0 100 0 0 20 0.0000 4 195 1830 3675 6225 Code Generator\001 4 1 0 100 0 0 20 0.0000 4 195 735 3675 4350 Parser\001 4 1 0 100 0 0 20 0.0000 4 195 1140 3675 2550 Tokenizer\001 4 1 0 100 0 0 20 0.0000 4 195 1020 3675 750 Interface\001 4 1 0 100 0 0 20 0.0000 4 195 990 3675 9825 Backend\001 4 1 0 100 0 0 14 0.0000 4 150 570 3675 1575 main.c\001 4 1 0 100 0 0 14 0.0000 4 195 1860 3675 6525 build.c delete.c expr.c\001 4 1 0 100 0 0 14 0.0000 4 195 2115 3675 6750 insert.c select.c update.c\001 4 1 0 100 0 0 14 0.0000 4 150 705 3675 6975 where.c\001 4 1 0 100 0 0 14 0.0000 4 150 630 3675 5175 parse.y\001 4 1 0 100 0 0 14 0.0000 4 150 870 3675 3375 tokenize.c\001 4 1 0 100 0 0 14 0.0000 4 150 570 3675 8775 vdbe.c\001 4 1 0 100 0 0 14 0.0000 4 150 570 3675 10500 dbbe.c\001 |
Changes to www/arch.png.
cannot compute difference between binary files
Changes to www/arch.tcl.
1 2 3 | # # Run this Tcl script to generate the sqlite.html file. # | | | 1 2 3 4 5 6 7 8 9 10 11 | # # Run this Tcl script to generate the sqlite.html file. # set rcsid {$Id: arch.tcl,v 1.2 2000/06/09 14:14:34 drh Exp $} puts {<html> <head> <title>Architecture of SQLite</title> </head> <body bgcolor=white> <h1 align=center> |
︙ | ︙ | |||
20 21 22 23 24 25 26 | <table align="right" border="1" cellpadding="15" cellspacing="1"> <tr><th>Block Diagram Of SQLite</th></tr> <tr><td><img src="arch.png"></td></tr> </table> <p>This file describes the architecture of the SQLite library. A block diagram showing the main components of SQLite | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <table align="right" border="1" cellpadding="15" cellspacing="1"> <tr><th>Block Diagram Of SQLite</th></tr> <tr><td><img src="arch.png"></td></tr> </table> <p>This file describes the architecture of the SQLite library. A block diagram showing the main components of SQLite and how they interrelate is shown at the right. The text that follows will provide a quick overview of each of these components. </p> <h2>Interface</h2> <p>The public interface to the SQLite library is implemented by four functions found in the <b>main.c</b> source file. Additional |
︙ | ︙ | |||
59 60 61 62 63 64 65 | <h2>Parser</h2> <p>The parser is the piece that assigns meaning to tokens based on their context. The parser for SQLite is generated using the <a href="http://www.hwaci.com/sw/lemon/">Lemon</a> LALR(1) parser generator. Lemon does the same job as YACC/BISON, but is uses | | < | | > | | > > > > > > > > > | | 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | <h2>Parser</h2> <p>The parser is the piece that assigns meaning to tokens based on their context. The parser for SQLite is generated using the <a href="http://www.hwaci.com/sw/lemon/">Lemon</a> LALR(1) parser generator. Lemon does the same job as YACC/BISON, but is uses a different input syntax which is less error-prone. Lemon also generates a parser which is reentrant and thread-safe. And lemon defines the concept of a non-terminal destructor so that it does not leak memory when syntax errors are encountered. The source file that drives Lemon is found in <b>parse.y</b>.</p> <p>Because lemon is a program not normally found on development machines, the complete source code to lemon (just one C file) is included in the SQLite distribution in the "tool" subdirectory. Documentation on lemon is found in the "doc" subdirectory of the distribution. </p> <h2>Code Generator</h2> <p>After the parser assembles tokens into complete SQL statements, it calls the code generator to produce virtual machine code that will do the work that the SQL statements request. There are seven files in the code generator: <b>build.c</b>, <b>delete.c</b>, <b>expr.c</b>, <b>insert.c</b> <b>select.c</b>, <b>update.c</b>, and <b>where.c</b>. In these files is where most of the serious magic happens. <b>expr.c</b> handles code generation for expressions. <b>where.c</b> handles code generation for WHERE clauses on SELECT, UPDATE and DELETE statements. The files <b>delete.c</b>, <b>insert.c</b>, <b>select.c</b>, and <b>update.c</b> handle the code generation for SQL statements with the same names. (Each of these files calls routines in <b>expr.c</b> and <b>where.c</b> as necessary.) All other SQL statements are coded out of <b>build.c</b>.</p> <h2>Virtual Machine</h2> <p>The program generated by the code generator is executed by the virtual machine. Additional information about the virtual machine is <a href="opcode.html">available separately</a>. To summarize, the virtual machine implements an abstract computing engine specifically designed to manipulate database files. The machine has a stack which is used for intermediate storage. Each instruction contains an opcode and up to three additional operands.</p> <p>The virtual machine is entirely contained in a single source file <b>vdbe.c</b>. The virtual machine also has its own header file <b>vdbe.h</b> that defines an interface between the virtual machine and the rest of the SQLite library.</p> |
︙ | ︙ |
Changes to www/index.tcl.
1 2 3 | # # Run this TCL script to generate HTML for the index.html file. # | | | 1 2 3 4 5 6 7 8 9 10 11 | # # Run this TCL script to generate HTML for the index.html file. # set rcsid {$Id: index.tcl,v 1.18 2000/06/09 14:14:34 drh Exp $} puts {<html> <head><title>SQLite: An SQL Database Engine Built Atop GDBM</title></head> <body bgcolor=white> <h1 align=center>SQLite: An SQL Database Engine Built Atop <a href="http://www.gnu.org/software/gdbm/gdbm.html">GDBM</a></h1> <p align=center>} |
︙ | ︙ | |||
88 89 90 91 92 93 94 95 96 97 | <h2>Documentation</h2> <p>The following documentation is currently available:</p> <p><ul> <li>Information on the <a href="sqlite.html">sqlite</a> command-line utility.</li> <li>The <a href="c_interface.html">C/C++ Interface</a>.</li> <li>The <a href="fileformat.html">file format</a> used by SQLite databases.</li> <li>The <a href="arch.html">Architecture of the SQLite Library</a> describes | > | | < < | 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | <h2>Documentation</h2> <p>The following documentation is currently available:</p> <p><ul> <li>Information on the <a href="sqlite.html">sqlite</a> command-line utility.</li> <li>The <a href="lang.html">SQL Language</a> subset understood by SQLite.</li> <li>The <a href="c_interface.html">C/C++ Interface</a>.</li> <li>The <a href="fileformat.html">file format</a> used by SQLite databases.</li> <li>The <a href="arch.html">Architecture of the SQLite Library</a> describes how the library is put together.</li> <li>A description of the <a href="opcode.html">virtual machine</a> that SQLite uses to access the database.</li> </ul> </p> <p>The SQLite source code is 35% comment. These comments are another important source of information. </p> } |
︙ | ︙ |
Changes to www/lang.tcl.
1 2 3 | # # Run this Tcl script to generate the sqlite.html file. # | | | 1 2 3 4 5 6 7 8 9 10 11 | # # Run this Tcl script to generate the sqlite.html file. # set rcsid {$Id: lang.tcl,v 1.4 2000/06/09 14:14:34 drh Exp $} puts {<html> <head> <title>Query Language Understood By SQLite</title> </head> <body bgcolor=white> <h1 align=center> |
︙ | ︙ | |||
43 44 45 46 47 48 49 | {{DROP INDEX} dropindex} {INSERT insert} {DELETE delete} {UPDATE update} {SELECT select} {COPY copy} {EXPLAIN explain} | | | 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | {{DROP INDEX} dropindex} {INSERT insert} {DELETE delete} {UPDATE update} {SELECT select} {COPY copy} {EXPLAIN explain} {expression expr} }] { puts "<li><a href=\"#[lindex $section 1]\">[lindex $section 0]</a></li>" } puts {</ul></p> <p>Details on the implementation of each command are provided in the sequel.</p> |
︙ | ︙ | |||
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | regsub -all {[|,.*()]} $body {<big>&</big>} body regsub -all { = } $body { <big>=</big> } body regsub -all {STAR} $body {<big>*</big>} body puts "<td><b><font color=\"#2c2cf0\">$body</font></b></td></tr>" } puts {</table>} } proc Section {name {label {}}} { puts "\n<hr />" if {$label!=""} { puts "<a name=\"$label\">" } puts "<h1>$name</h1>\n" } proc Example {text} { puts "<blockquote><pre>$text</pre></blockquote>" } Section COPY copy Syntax {sql-statement} { | > > > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | regsub -all {[|,.*()]} $body {<big>&</big>} body regsub -all { = } $body { <big>=</big> } body regsub -all {STAR} $body {<big>*</big>} body puts "<td><b><font color=\"#2c2cf0\">$body</font></b></td></tr>" } puts {</table>} } proc Operator {name} { return "<font color=\"#2c2cf0\"><big>$name</big></font>" } proc Nonterminal {name} { return "<i><font color=\"#ff3434\">$name</font></i>" } proc Keyword {name} { return "<font color=\"#2c2cf0\">$name</font>" } proc Section {name {label {}}} { puts "\n<hr />" if {$label!=""} { puts "<a name=\"$label\">" } puts "<h1>$name</h1>\n" } proc Example {text} { puts "<blockquote><pre>$text</pre></blockquote>" } Section COPY copy Syntax {sql-statement} { COPY <table-name> FROM <filename> } puts { <p>The COPY command is an extension used to load large amounts of data into a table. It is modeled after a similar command found in PostgreSQL. In fact, the SQLite COPY command is specifically designed to be able to read the output of the PostgreSQL dump utility <b>pg_dump</b> so that data can be easily transferred from PostgreSQL into SQLite.<p> <p>The table-name is the name of an existing table which is to be filled with data. The filename is a string or identifier that names a file from which data will be read. The filename can be the <b>STDIN</b> to read data from standard input.<p> <p>Each line of the input file is converted into a single record in the table. Columns are separated by tabs. If a tab occurs as data within a column, then that tab is preceded by a baskslash "\" character. A baskslash in the data appears as two backslashes in a row.</p> <p>When the input data source is STDIN, the input can be terminated by a line that contains only a baskslash and a dot:} puts "\"[Operator \\.]\".</p>" Section {CREATE INDEX} createindex Syntax {sql-statement} { CREATE INDEX <index-name> ON <table-name> ( <column-name> [, <column-name>]* ) } {column-name} { <name> [ ASC | DESC ] |
︙ | ︙ | |||
182 183 184 185 186 187 188 | Section DELETE delete Syntax {sql-statement} { DELETE FROM <table-name> [WHERE <expression>] } puts { | > > > | | > > > > > | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | Section DELETE delete Syntax {sql-statement} { DELETE FROM <table-name> [WHERE <expression>] } puts { <p>The DELETE command is used to remove records from a table. The command consists of the "DELETE FROM" keywords followed by the name of the table from which records are to be removed. </p> <p>Without a WHERE clause, all rows of the table are removed. If a WHERE clause is supplied, then only those rows that match the expression are removed.</p> } Section {DROP INDEX} dropindex Syntax {sql-command} { DROP INDEX <index-name> } |
︙ | ︙ | |||
208 209 210 211 212 213 214 | DROP TABLE <table-name> } puts { <p>The DROP TABLE statement consists of the keywords "DROP TABLE" followed by the name of the table. The table named is completely removed from the disk. The table can not be recovered. All indices associated with | | > > > > > > > > > > > > > > | | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 | DROP TABLE <table-name> } puts { <p>The DROP TABLE statement consists of the keywords "DROP TABLE" followed by the name of the table. The table named is completely removed from the disk. The table can not be recovered. All indices associated with the table are also deleted.</p>} Section EXPLAIN explain Syntax {sql-statement} { EXPLAIN <sql-statement> } puts { <p>The EXPLAIN command modifier is a non-standard extension. The idea comes from a similar command found in PostgreSQL, but the operation is completely different.</p> <p>If the EXPLAIN keyword appears before any other SQLite SQL command then instead of actually executing the command, the SQLite library will report back the sequence of virtual machine instructions it would have used to execute the command had the EXPLAIN keyword not been present. For additional information about virtual machine instructions see the <a href="arch.html">architecture description</a> or the documentation on <a href="opcode.html">available opcodes</a> for the virtual machine.</p> } Section expression expr Syntax {expression} { <expression> <binary-op> <expression> | <expression> <like-op> <expression> | <unary-op> <expression> | ( <expression> ) | <column-name> | <table-name> . <column-name> | <literal-value> | <function-name> ( <expr-list> | STAR ) | <expression> ISNULL | <expression> NOTNULL | <expression> [NOT] BETWEEN <expression> AND <expression> | <expression> [NOT] IN ( <value-list> ) | <expression> [NOT] IN ( <select> ) | ( <select> ) } {like-op} { LIKE | GLOB | NOT LIKE | NOT GLOB } puts { <p>This section is different from the others. Every other section of this document talks about a particular SQL command. This section does not talk about a standalone command but about "expressions" which are subcomponent of most other commands.</p> <p>SQLite understands the following binary operators, in order from highest to lowest precedence:</p> <blockquote><pre> <font color="#2c2cf0"><big>* / + - < <= > >= = == != <> </big>IN AND OR</font> </pre></blockquote> <p>Any SQLite value can be used as part of an expression. For arithmetic operations, integers are treated as integers. Strings are first converted to real numbers using <b>atof()</b>. For comparison operators, numbers compare as numbers and strings compare as strings. For string comparisons, case is significant but is only used to break a tie. Note that there are two variations of the equals and not equals operators. Equals can be either} puts "[Operator =] or [Operator ==]. The non-equals operator can be either [Operator !=] or [Operator {<>}].</p>" puts { <p>The LIKE operator does a wildcard comparision. The operand to the right contains the wildcards.} puts "A percent symbol [Operator %] in the right operand matches any sequence of zero or more characters on the left. An underscore [Operator _] on the right matches any single character on the left. The LIKE operator is not case sensitive and will match upper case characters on one side against lower case characters on the other.</p>" puts { <p>The GLOB operator is similar to LIKE but uses the Unix file globbing syntax for its wildcards. Also, GLOB is case sensitive, unlike LIKE. Both GLOB and LIKE may be preceded by the NOT keyword to invert the sense of the test.</p> <p>SELECT statements can appear in expressions as either the right-hand operand of the IN operator or as a scalar quantity. In both cases, the SELECT should have only a single column in its result. Compound SELECTs (connected with keywords like UNION or EXCEPT) are allowed. Any ORDER BY clause on the select is ignored. A SELECT in an expression is evaluated once before any other processing is performed, so none of the expressions within the select itself can refer to quantities in the containing expression.</p> <p>When a SELECT is the right operand of the IN operator, the IN operator returns TRUE if the result of the left operand is any of the values generated by the select. The IN operator may be preceded by the NOT keyword to invert the sense of the test.</p> <p>When a SELECT appears within an expression but is not the right operand of an IN operator, then the first row of the result of the SELECT becomes the value used in the expression. If the SELECT yields more than one result row, all rows after the first are ignored. If the SELECT yeilds no rows, then the value of the SELECT is NULL.</p> } Section INSERT insert Syntax {sql-statement} { INSERT INTO <table-name> [( <column-list> )] VALUES ( <value-list> ) | INSERT INTO <table-name> [( <column-list> )] <select-statement> } |
︙ | ︙ | |||
275 276 277 278 279 280 281 | SELECT <result> FROM <table-list> [WHERE <expression>] [GROUP BY <expr-list>] [HAVING <expression>] [<compound-op> <select>]* [ORDER BY <sort-expr-list>] } {result} { | > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | > > > > > | 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 | SELECT <result> FROM <table-list> [WHERE <expression>] [GROUP BY <expr-list>] [HAVING <expression>] [<compound-op> <select>]* [ORDER BY <sort-expr-list>] } {result} { STAR | <result-column> [, <result-column>]* } {result-column} { <expression> [ [AS] <string> ] } {table-list} { <table-name> [, <table-name>]* } {sort-expr-list} { <expr> [<sort-order>] [, <expr> [<sort-order>]]* } {sort-order} { ASC | DESC } {compound_op} { UNION | UNION ALL | INTERSECT | EXCEPT } puts { <p>The SELECT statement is used to query the database. The result of a SELECT is zero or more rows of data where each row has a fixed number of columns. The number of columns in the result is specified by the expression list in between the SELECT and FROM keywords. Any arbitrary expression can be used as a result. If the result specification is just} puts "[Operator *] then all columns of all tables are used as the result." puts {</p> <p>The query is executed again one or more tables specified after the FROM keyword. If more than one table is specified, then the query is against the join of the various tables.</p> <p>The WHERE clause can be used to limit the number of rows over which the query operates. Note that because of limitations of GDBM (it uses hashing not b-trees) indices will only be used to optimize the query if WHERE expression contains equality comparisons connected by the AND operator.</p> <p>The GROUP BY clauses causes one or more rows of the result to be combined into a single row of output. This is especially useful when the result contains aggregate functions. The expressions in the GROUP BY clause do <em>not</em> have to be expressions that appear in the result. The HAVING clause is similar to WHERE except that HAVING applies after grouping has occurred. The HAVING expression may refer to values, even aggregate functions, that are not in the result.</p> <p>The ORDER BY clause causes the output rows to be sorted. The argument to ORDER BY is a list of expressions that are used as the key for the sort. The expressions do not have to be part of the result for a simple SELECT, but in a compound SELECT each sort expression must exactly match one of the result columns. Each sort expression may be optionally followed by ASC or DESC to specify the sort order.</p> <p>A compound SELECT is formed from two or more simple SELECTs connected by one of the operators UNION, UNION ALL, INTERSECT, or EXCEPT. In a compound SELECT, all the constituent SELECTs must specify the same number of result columns. There may be only a single ORDER BY clause at the end of the compound SELECT. The UNION and UNION ALL operators combine the results of the SELECTs to the right and left into a single big table. The difference is that in UNION all result rows are distinct where in UNION ALL there may be duplicates. The INTERSECT operator takes the intersection of the results of the left and right SELECTs. EXCEPT takes the result of left SELECT after removing the results of the right SELECT. When three are more SELECTs are connected into a compound, they group from left to right.</p> } Section UPDATE update Syntax {sql-statement} { UPDATE <table-name> SET <assignment> [, <assignment>] [WHERE <expression>] } {assignment} { <column-name> = <expression> } puts { <p>The UPDATE statement is used to change the value of columns in selected rows of a table. Each assignment in an UPDATE specifies a column name to the left of the equals sign and an arbitrary expression to the right. The expressions may use the values of other columns. All expressions are evaluated before any assignments are made. A WHERE clause can be used to restrict which rows are updated. } Section VACUUM vacuum Syntax {sql-statement} { VACUUM [<index-or-table-name>] } |
︙ | ︙ |
Changes to www/opcode.tcl.
1 2 3 | # # Run this Tcl script to generate the sqlite.html file. # | | | 1 2 3 4 5 6 7 8 9 10 11 | # # Run this Tcl script to generate the sqlite.html file. # set rcsid {$Id: opcode.tcl,v 1.2 2000/06/09 14:14:34 drh Exp $} puts {<html> <head> <title>SQLite Virtual Machine Opcodes</title> </head> <body bgcolor=white> <h1 align=center> |
︙ | ︙ | |||
47 48 49 50 51 52 53 | puts { <h2>Introduction</h2> <p>In order to execute an SQL statement, the SQLite library first parses the SQL, analyzes the statement, then generates a short program to execute the statement. The program is generated for a "virtual machine" implemented | | | 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | puts { <h2>Introduction</h2> <p>In order to execute an SQL statement, the SQLite library first parses the SQL, analyzes the statement, then generates a short program to execute the statement. The program is generated for a "virtual machine" implemented by the SQLite library. This document describes the operation of that virtual machine.</p> <p>The source code to the virtual machine is in the <b>vdbe.c</b> source file. All of the opcode definitions further down in this document are contained in comments in the source file. In fact, the opcode table in this document was generated by scanning the <b>vdbe.c</b> source file |
︙ | ︙ | |||
76 77 78 79 80 81 82 | (2) the program counter becomes one greater than the address of last instruction, or (3) there is an execution error. When the virtual machine halts, all memory that it allocated is released and all database files it may have had open are closed.</p> <p>The virtual machine also contains an operand stack of unlimited | | | | | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | (2) the program counter becomes one greater than the address of last instruction, or (3) there is an execution error. When the virtual machine halts, all memory that it allocated is released and all database files it may have had open are closed.</p> <p>The virtual machine also contains an operand stack of unlimited depth. Many of the opcodes use operands from the stack. See the individual opcode descriptions for details.</p> <p>The virtual machine can have zero or more cursors. Each cursor is a pointer into a single GDBM file. There can be multiple cursors pointing at the same file. All cursors operate independently, even cursors pointing to the same file. The only way for the virtual machine to interact with a GDBM file is through a cursor. Instructions in the virtual machine can create a new cursor (Open), read data from a cursor (Field), advance the cursor to the next entry in the GDBM file (Next), and many other operations. All cursors are automatically closed when the virtual machine terminates.</p> |
︙ | ︙ | |||
108 109 110 111 112 113 114 115 116 117 118 119 120 121 | fact that the virtual machine allows multiple sorters is an historical accident. In practice no more than one sorter (sorter number 0) ever gets used.</p> <p>The virtual machine may contain an arbitrary number of "Lists". Each list stores a list of integers. Lists are used to hold the GDBM keys for records of a GDBM file that needs to be modified. The WHERE clause of an UPDATE or DELETE statement scans through the table and writes the GDBM key of every record to be modified into a list. Then the list is played back and the table is modified in a separate step. It is necessary to do this in two steps since making a change to a GDBM file can alter the scan order.</p> <p>The virtual machine can contain an arbitrary number of "Sets". | > > | 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | fact that the virtual machine allows multiple sorters is an historical accident. In practice no more than one sorter (sorter number 0) ever gets used.</p> <p>The virtual machine may contain an arbitrary number of "Lists". Each list stores a list of integers. Lists are used to hold the GDBM keys for records of a GDBM file that needs to be modified. (See the <a href="fileformat.html">file format</a> description for more information on GDBM keys in SQLite table files.) The WHERE clause of an UPDATE or DELETE statement scans through the table and writes the GDBM key of every record to be modified into a list. Then the list is played back and the table is modified in a separate step. It is necessary to do this in two steps since making a change to a GDBM file can alter the scan order.</p> <p>The virtual machine can contain an arbitrary number of "Sets". |
︙ | ︙ |