1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-01-06 08:01:16 +03:00

AUTOINCREMENT documentation added. Improvements to lang.html. (CVS 2129)

FossilOrigin-Name: ac72a1d5518f7b505ae2a1bd3be3d71db461ae7e
This commit is contained in:
drh
2004-11-21 01:02:00 +00:00
parent 60404f46c1
commit f856582562
6 changed files with 344 additions and 189 deletions

View File

@@ -408,6 +408,9 @@ arch.html: $(TOP)/www/arch.tcl
arch2.gif: $(TOP)/www/arch2.gif
cp $(TOP)/www/arch2.gif .
autoinc.html: $(TOP)/www/autoinc.tcl
tclsh $(TOP)/www/autoinc.tcl >autoinc.html
c_interface.html: $(TOP)/www/c_interface.tcl
tclsh $(TOP)/www/c_interface.tcl >c_interface.html
@@ -420,6 +423,9 @@ capi3ref.html: $(TOP)/www/capi3ref.tcl
changes.html: $(TOP)/www/changes.tcl
tclsh $(TOP)/www/changes.tcl >changes.html
compile.html: $(TOP)/www/compile.tcl
tclsh $(TOP)/www/compile.tcl >compile.html
copyright.html: $(TOP)/www/copyright.tcl
tclsh $(TOP)/www/copyright.tcl >copyright.html
@@ -510,11 +516,13 @@ version3.html: $(TOP)/www/version3.tcl
#
DOC = \
arch.html \
arch2.gif \
arch.png \
autoinc.html \
c_interface.html \
capi3.html \
capi3ref.html \
changes.html \
compile.html \
copyright.html \
copyright-release.html \
copyright-release.pdf \
@@ -534,6 +542,7 @@ DOC = \
oldnews.html \
omitted.html \
opcode.html \
pragma.html \
quickstart.html \
speed.html \
sqlite.gif \
@@ -541,7 +550,7 @@ DOC = \
support.html \
tclsqlite.html \
vdbe.html \
version3.html
version3.html
doc: common.tcl $(DOC)
mkdir -p doc

14
main.mk
View File

@@ -384,6 +384,9 @@ arch.html: $(TOP)/www/arch.tcl
arch.png: $(TOP)/www/arch.png
cp $(TOP)/www/arch.png .
autoinc.html: $(TOP)/www/autoinc.tcl
tclsh $(TOP)/www/autoinc.tcl >autoinc.html
c_interface.html: $(TOP)/www/c_interface.tcl
tclsh $(TOP)/www/c_interface.tcl >c_interface.html
@@ -396,6 +399,9 @@ capi3ref.html: $(TOP)/www/capi3ref.tcl
changes.html: $(TOP)/www/changes.tcl
tclsh $(TOP)/www/changes.tcl >changes.html
compile.html: $(TOP)/www/compile.tcl
tclsh $(TOP)/www/compile.tcl >compile.html
copyright.html: $(TOP)/www/copyright.tcl
tclsh $(TOP)/www/copyright.tcl >copyright.html
@@ -484,19 +490,18 @@ vdbe.html: $(TOP)/www/vdbe.tcl
version3.html: $(TOP)/www/version3.tcl
tclsh $(TOP)/www/version3.tcl >version3.html
compile.html: $(TOP)/www/compile.tcl
tclsh $(TOP)/www/compile.tcl >compile.html
# Files to be published on the website.
#
DOC = \
arch.html \
arch.png \
autoinc.html \
c_interface.html \
capi3.html \
capi3ref.html \
changes.html \
compile.html \
copyright.html \
copyright-release.html \
copyright-release.pdf \
@@ -524,8 +529,7 @@ DOC = \
support.html \
tclsqlite.html \
vdbe.html \
version3.html \
compile.html
version3.html
doc: common.tcl $(DOC)
mkdir -p doc

View File

@@ -1,6 +1,6 @@
C Fix\sto\sthe\sdocumentation\son\ssqlite3_create_function.\s\sTicket\s#899.\s(CVS\s2128)
D 2004-11-20T21:02:14
F Makefile.in e747bb5ba34ccbdd81f79dcf1b2b33c02817c21d
C AUTOINCREMENT\sdocumentation\sadded.\s\sImprovements\sto\slang.html.\s(CVS\s2129)
D 2004-11-21T01:02:00
F Makefile.in 8291610f5839939a5fbff4dbbf85adb0fe1ac37f
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
F VERSION 342b6d5fde93b6d45023e2fee0163dda6464b9d6
@@ -16,7 +16,7 @@ F doc/lemon.html f0f682f50210928c07e562621c3b7e8ab912a538
F doc/report1.txt a031aaf37b185e4fa540223cb516d3bccec7eeac
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895
F ltmain.sh f6b283068efa69f06eb8aa1fe4bddfdbdeb35826
F main.mk 088758a26c59b5bb60c1d8d3185b219fe7944796
F main.mk 31af0ba9d4d0f03a5db4051a6f2ca527dfae3daf
F mkdll.sh 468d4f41d3ea98221371df4825cfbffbaac4d7e4
F mkopcodec.awk 14a794f7b206976afc416b30fe8e0fc97f3434e9
F mkopcodeh.awk 4090944e4de0a2ccb99aa0083290f73bce4db406
@@ -225,6 +225,7 @@ F www/arch2.fig ae2432145c26cfa148fa0116589517ad3cd5fc65
F www/arch2.gif 6f2d47c4e0c5842c0d6b5513fd8249393d7c7003
F www/arch2b.fig d22a2c9642d584b89d4088b1e51e2bb0f7c04bed
F www/audit.tcl 90e09d580f79c7efec0c7d6f447b7ec5c2dce5c0
F www/autoinc.tcl b357f5ba954b046ee35392ce0f884a2fcfcdea06
F www/c_interface.tcl b51b08591554c16a0c3ef718364a508ac25abc7e
F www/capi3.tcl 5c1cb163f4d2a54e2d0e22dcc399dd71245c8b89
F www/capi3ref.tcl 682ed717d564a1234badb8a563837547e140a382
@@ -244,7 +245,7 @@ F www/faq.tcl abe360e630d8134bc6242c5e3664969c397eac6e
F www/fileformat.tcl 900c95b9633abc3dcfc384d9ddd8eb4876793059
F www/formatchng.tcl bfbf14dbf5181e771d06da7797767b0200b36d8a
F www/index.tcl bb67c0d13020641d1fb4c043afa1f40fcc144d88
F www/lang.tcl b2d8272bc89d94db373b4f1d071b1faa1153109a
F www/lang.tcl 9670e34e0a4a518b7de27a68055f49a790b6a840
F www/lockingv3.tcl f59b19d6c8920a931f096699d6faaf61c05db55f
F www/mingw.tcl d96b451568c5d28545fefe0c80bee3431c73f69c
F www/nulls.tcl ec35193f92485b87b90a994a01d0171b58823fcf
@@ -260,7 +261,7 @@ F www/tclsqlite.tcl 560ecd6a916b320e59f2917317398f3d59b7cc25
F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
F www/whentouse.tcl fdacb0ba2d39831e8a6240d05a490026ad4c4e4c
P d10560c75244daebe55da5630ef7e7b84ba7f77a
R 30545a0753dd70ce9583a0fefab75a16
P 4ab1d012f0f365c46bcabe67eace891eeaa78d70
R 36dcf878f43a703fc736b88e118828a1
U drh
Z 9264d8e15e126e08fc159b47651406eb
Z ef040ca6aab550074695604039d8de29

View File

@@ -1 +1 @@
4ab1d012f0f365c46bcabe67eace891eeaa78d70
ac72a1d5518f7b505ae2a1bd3be3d71db461ae7e

109
www/autoinc.tcl Normal file
View File

@@ -0,0 +1,109 @@
#
# Run this Tcl script to generate the autoinc.html file.
#
set rcsid {$Id: }
source common.tcl
if {[llength $argv]>0} {
set outputdir [lindex $argv 0]
} else {
set outputdir ""
}
header {SQLite Autoincrement}
puts {
<h1>SQLite Autoincrement</h1>
<p>
In SQLite, every row of every table has an integer ROWID.
The ROWID for each row is unique among all rows in the same table.
In SQLite version 2.8 the ROWID is a 32-bit signed integer.
Version 3.0 of SQLite expanded the ROWID to be a 64-bit signed integer.
</p>
<p>
You can access the ROWID of an SQLite table using one the special column
names ROWID, _ROWID_, or OID.
Except if you declare an ordinary table column to use one of those special
names, then the use of that name will refer to the declared column not
to the internal ROWID.
</p>
<p>
If a table contains a column of type INTEGER PRIMARY KEY, then that
column becomes an alias for the ROWID. You can then access the ROWID
using any of four different names, the original three names described above
or the name given to the INTEGER PRIMARY KEY column. All these names are
aliases for one another and work equally well in any context.
</p>
<p>
When a new row is inserted into an SQLite table, the ROWID can either
be specified as part of the INSERT statement or it can be assigned
automatically by the database engine. To specify a ROWID manually,
just include it in the list of values to be inserted. For example:
</p>
<blockquote><pre>
CREATE TABLE test1(a INT, b TEXT);
INSERT INTO test1(rowid, a, b) VALUES(123, 5, 'hello');
</pre></blockquote>
<p>
If no ROWID is specified on the insert, an appropriate ROWID is created
automatically. The usual algorithm is to give the newly created row
a ROWID that is one larger than the largest ROWID in the table prior
to the insert. If the table is initially empty, then a ROWID of 1 is
used. If the largest ROWID is equal to the largest possible integer
(9223372036854775807 in SQLite version 3.0 and later) then the database
engine starts picking candidate ROWIDs at random until it finds one
that is not previously used.
</p>
<p>
The normal ROWID selection algorithm described above
will generate monotonically increasing
unique ROWIDs as long as you never use the maximum ROWID value and you never
delete the entry in the table with the largest ROWID.
If you ever delete rows or if you ever create a row with the maximum possible
ROWID, then ROWIDs from previously deleted rows might be reused when creating
new rows and newly created ROWIDs might not be in strictly accending order.
</p>
<h2>The AUTOINCREMENT Keyword</h2>
<p>
If a column has the type INTEGER PRIMARY KEY AUTOINCREMENT then a slightly
different ROWID selection algorithm is used.
The ROWID chosen for the new row is one larger than the largest ROWID
that has ever before existed in that same table. If the table has never
before contained any data, then a ROWID of 1 is used. If the table
has previously held a row with the largest possible ROWID, then new INSERTs
are not allowed and any attempt to insert a new row will fail with an
SQLITE_FULL error.
</p>
<p>
SQLite keeps track of the largest ROWID that a table has ever held using
the special SQLITE_SEQUENCE table. The SQLITE_SEQUENCE table is created
and initialized automatically whenever a normal table that contains an
AUTOINCREMENT column is created. The content of the SQLITE_SEQUENCE table
can be modified using ordinary UPDATE, INSERT, and DELETE statements.
But making modifications to this table will likely perturb the AUTOINCREMENT
key generation algorithm. Make sure you know what you are doing before
you undertake such changes.
</p>
<p>
The behavior implemented by the AUTOINCREMENT keyword is subtly different
from the default behavior. With AUTOINCREMENT, rows with automatically
selected ROWIDs are guaranteed to have ROWIDs that have never been used
before by the same table in the same database. And the automatically generated
ROWIDs are guaranteed to be monotonically increasing. These are important
properties in certain applications. But if your application does not
need these properties, you should probably stay with the default behavior
since the use of AUTOINCREMENT requires additional work to be done
as each row is inserted and thus causes INSERTs to run a little slower.
}
footer $rcsid

View File

@@ -1,7 +1,7 @@
#
# Run this Tcl script to generate the sqlite.html file.
# Run this Tcl script to generate the lang-*.html files.
#
set rcsid {$Id: lang.tcl,v 1.79 2004/11/20 08:17:18 danielk1977 Exp $}
set rcsid {$Id: lang.tcl,v 1.80 2004/11/21 01:02:01 drh Exp $}
source common.tcl
if {[llength $argv]>0} {
@@ -12,15 +12,15 @@ if {[llength $argv]>0} {
header {Query Language Understood by SQLite}
puts {
<h2>SQL As Understood By SQLite</h2>
<h1>SQL As Understood By SQLite</h1>
<p>The SQLite library understands most of the standard SQL
language. But it does <a href="omitted.html">omit some features</a>
while at the same time
adding a few features of its own. This document attempts to
describe precisely what parts of the SQL language SQLite does
and does not support. A list of <a href="#keywords">keywords</a> is
given at the end.</p>
and does not support. A list of <a href="lang_keywords.html">keywords</a> is
also provided.</p>
<p>In all of the syntax diagrams that follow, literal text is shown in
bold blue. Non-terminal symbols are shown in italic red. Operators
@@ -122,7 +122,9 @@ proc Section {name label} {
rename footer_standard footer
}
set ::section_file [open [file join $outputdir lang_$label.html] w]
header "SQL command \"$name\""
header "Query Language Understood by SQLite: $name"
puts "<h1>SQL As Understood By SQLite</h1>"
puts "<a href=\"lang.html\">\[Contents\]</a>"
puts "<h2>$name</h2>"
return
}
@@ -448,7 +450,7 @@ CREATE [TEMP | TEMPORARY] TABLE [<database-name>.] <table-name> AS <select-state
<typename> ( <number> , <number> )
} {column-constraint} {
NOT NULL [ <conflict-clause> ] |
PRIMARY KEY [<sort-order>] [ <conflict-clause> ] |
PRIMARY KEY [<sort-order>] [ <conflict-clause> ] [AUTOINCREMENT] |
UNIQUE [ <conflict-clause> ] |
CHECK ( <expr> ) [ <conflict-clause> ] |
DEFAULT <value> |
@@ -492,7 +494,7 @@ YYYY-MM-DD. The format for CURRENT_TIMESTAMP is "YYYY-MM-DD HH:MM:SS".
</p>
<p>Specifying a PRIMARY KEY normally just creates a UNIQUE index
on the primary key. However, if primary key is on a single column
on the corresponding columns. However, if primary key is on a single column
that has datatype INTEGER, then that column is used internally
as the actual key of the B-Tree for the table. This means that the column
may only hold unique integer values. (Except for this one case,
@@ -503,7 +505,11 @@ then the B-Tree key will be a automatically generated integer. The
B-Tree key for a row can always be accessed using one of the
special names "<b>ROWID</b>", "<b>OID</b>", or "<b>_ROWID_</b>".
This is true regardless of whether or not there is an INTEGER
PRIMARY KEY.</p>
PRIMARY KEY. An INTEGER PRIMARY KEY column man also include the
keyword AUTOINCREMENT. The AUTOINCREMENT keyword modified the way
that B-Tree keys are automatically generated. Additional detail
on automatic B-Tree key generation is available
<a href="autoinc.html">separately</a>.</p>
<p>If the "TEMP" or "TEMPORARY" keyword occurs in between "CREATE"
and "TABLE" then the table that is created is only visible to the
@@ -798,8 +804,7 @@ puts {
with the <a href="#createindex">
CREATE INDEX</a> statement. The index named is completely removed from
the disk. The only way to recover the index is to reenter the
appropriate CREATE INDEX command. Non-temporary indexes on tables in
an attached database cannot be dropped.</p>
appropriate CREATE INDEX command.</p>
<p>The DROP INDEX statement does not reduce the size of the database
file. Empty space in the database is retained for later INSERTs. To
@@ -1543,192 +1548,219 @@ is auto-vacuum mode, enabled using the
<a href="pragma.html#pragma_auto_vacuum">auto_vacuum pragma</a>.</p>
}
# A list of keywords. A asterisk occurs after the keyword if it is on
# the fallback list.
#
set keyword_list [lsort {
ABORT*
AFTER*
ALL
ALTER
AND
AS
ASC*
ATTACH*
AUTOINCREMENT
BEFORE*
BEGIN*
BETWEEN
BY
CASCADE*
CASE
CHECK
COLLATE
COMMIT
CONFLICT*
CONSTRAINT
CREATE
CROSS
CURRENT_DATE*
CURRENT_TIME*
CURRENT_TIMESTAMP*
DATABASE*
DEFAULT
DEFERRED*
DEFERRABLE
DELETE
DESC*
DETACH*
DISTINCT
DROP
END*
EACH*
ELSE
ESCAPE
EXCEPT
EXCLUSIVE*
EXPLAIN*
FAIL*
FOR*
FOREIGN
FROM
FULL
GLOB*
GROUP
HAVING
IGNORE*
IMMEDIATE*
IN
INDEX
INITIALLY*
INNER
INSERT
INSTEAD*
INTERSECT
INTO
IS
ISNULL
JOIN
KEY*
LEFT
LIKE*
LIMIT
MATCH*
NATURAL
NOT
NOTNULL
NULL
OF*
OFFSET*
ON
OR
ORDER
OUTER
PRAGMA*
PRIMARY
RAISE*
REFERENCES
REINDEX*
RENAME*
REPLACE*
RESTRICT*
RIGHT
ROLLBACK
ROW*
SELECT
SET
STATEMENT*
TABLE
TEMP*
TEMPORARY*
THEN
TO
TRANSACTION
TRIGGER*
UNION
UNIQUE
UPDATE
USING
VACUUM*
VALUES
VIEW*
WHEN
WHERE
}]
Section {SQLite keywords} keywords
puts {
<p>The following keywords are used by SQLite. Most are either reserved
words in SQL-92 or were listed as potential reserved words. Those which
aren't are shown in italics. Not all of these words are actually used
by SQLite. Keywords are not reserved in SQLite. Any keyword can be used
as an identifier for SQLite objects (columns, databases, indexes, tables,
triggers, views, ...) but must generally be enclosed by brackets or
quotes to avoid confusing the parser. Keyword matching in SQLite is
case-insensitive.</p>
<p>The SQL standard specifies a huge number of keywords which may not
be used as the names of tables, indices, columns, or databases. The
list is so long that few people can remember them all. For most SQL
code, your safest bet is to never use any English language word as the
name of a user-defined object.</p>
<p>Keywords can be used as identifiers in three ways:</p>
<p>If you want to use a keyword as a name, you need to quote it. There
are three ways of quoting keywords in SQLite:</p>
<p>
<blockquote>
<table>
<tr> <td width=12%> 'keyword'
<td>Interpreted as a literal string if it occurs in a legal string
context, otherwise as an identifier.
<tr> <td> "keyword"
<td>Interpreted as an identifier if it matches a known identifier
and occurs in a legal identifier context, otherwise as a string.
<tr> <td> [keyword]
<td> Always interpreted as an identifier. (This notation is used
by MS Access and SQL Server.)
<tr> <td valign="top"><b>'keyword'</b></td><td width="20"></td>
<td>A keyword in single quotes is interpreted as a literal string
if it occurs in a context where a string literal is allowed, otherwise
it is understood as an identifier.</td></tr>
<tr> <td valign="top"><b>"keyword"</b></td><td></td>
<td>A keyword in double-quotes is interpreted as an identifier if
it matches a known identifier. Otherwise it is interpreted as a
string literal.</td></tr>
<tr> <td valign="top"><b>[keyword]</b></td><td></td>
<td>A keyword enclosed in square brackets is always understood as
an identifier. This is not standard SQL. This quoting mechanism
is used by MS Access and SQL Server and is included in SQLite for
compatibility.</td></tr>
</table>
</blockquote>
</p>
<h2>Fallback Keywords</h2>
<p>Quoted keywords are unaesthetic.
To help you avoid them, SQLite allows many keywords to be used unquoted
as the names of databases, tables, indices, triggers, views, and/or columns.
In the list of keywords that follows, those that can be used as identifiers
are shown in an italic font. Keywords that must be quoted in order to be
used as identifiers are shown in bold.</p>
<p>These keywords can be used as identifiers for SQLite objects without
delimiters.</p>
<p>
SQLite adds new keywords from time to time when it take on new features.
So to prevent you code from being broken by future enhancements, you should
normally quote any indentifier that is an English language word, even if
you do not have to.
</p>
<p>
The following are the keywords currently recognized by SQLite:
</p>
<blockquote>
<table width="100%">
<tr>
<td align="left" valign="top" width="20%">
}
proc keyword_list {x} {
puts "<p>"
foreach k $x {
if {[string index $k 0]=="*"} {
set nonstandard 1
set k [string range $k 1 end]
} else {
set nonstandard 0
}
if {$nonstandard} {
puts "<i>$k</i> &nbsp;&nbsp;"
} else {
puts "$k &nbsp;&nbsp;"
}
set n [llength $keyword_list]
set nCol 5
set nRow [expr {($n+$nCol-1)/$nCol}]
set i 0
foreach word $keyword_list {
if {[string index $word end]=="*"} {
set word [string range $word 0 end-1]
set font i
} else {
set font b
}
puts "</p>\n"
}
keyword_list {
*ABORT
AFTER
ASC
*ATTACH
BEFORE
BEGIN
DEFERRED
CASCADE
*CLUSTER
*CONFLICT
*COPY
CROSS
*DATABASE
*DELIMITERS
DESC
*DETACH
EACH
END
EXPLAIN
*EXPLAIN
*FAIL
FOR
FULL
IGNORE
IMMEDIATE
INITIALLY
INNER
*INSTEAD
KEY
LEFT
MATCH
NATURAL
OF
*OFFSET
OUTER
*PRAGMA
*RAISE
*REPLACE
RESTRICT
RIGHT
*ROW
*STATEMENT
*TEMP
TEMPORARY
TRIGGER
*VACUUM
VIEW
}
puts {
<h2>Normal keywords</h2>
<p>These keywords can be used as identifiers for SQLite objects, but
must be enclosed in brackets or quotes for SQLite to recognize them as
an identifier.</p>
}
keyword_list {
ALL
AND
AS
BETWEEN
BY
CASE
CHECK
COLLATE
COMMIT
CONSTRAINT
CREATE
DEFAULT
DEFERRABLE
DELETE
DISTINCT
DROP
ELSE
EXCEPT
ESCAPE
FOREIGN
FROM
*GLOB
GROUP
HAVING
IN
*INDEX
INSERT
INTERSECT
INTO
IS
*ISNULL
JOIN
LIKE
LIMIT
NOT
*NOTNULL
NULL
ON
OR
ORDER
PRIMARY
REFERENCES
ROLLBACK
SELECT
SET
TABLE
THEN
TRANSACTION
UNION
UNIQUE
UPDATE
USING
VALUES
WHEN
WHERE
if {$i==$nRow} {
puts "</td><td valign=\"top\" align=\"left\" width=\"20%\">"
set i 1
} else {
incr i
}
puts "<$font>$word</$font><br>"
}
puts {
<h2>Special words</h2>
</td></tr></table></blockquote>
<h2>Special names</h2>
<p>The following are not keywords in SQLite, but are used as names of
system objects. They can be used as an identifier for a different
type of object.</p>
}
keyword_list {
*_ROWID_
*MAIN
OID
*ROWID
*SQLITE_MASTER
*SQLITE_TEMP_MASTER
<blockquote><b>
_ROWID_<br>
MAIN<br>
OID<br>
ROWID<br>
SQLITE_MASTER<br>
SQLITE_SEQUENCE<br>
SQLITE_TEMP_MASTER<br>
TEMP<br>
</b></blockquote>
}
footer $rcsid
if {[string length $outputdir]} {
footer $rcsid
}