diff options
-rw-r--r-- | manifest | 14 | ||||
-rw-r--r-- | manifest.uuid | 2 | ||||
-rw-r--r-- | www/capi3.tcl | 364 | ||||
-rw-r--r-- | www/datatype3.tcl | 308 | ||||
-rw-r--r-- | www/docs.tcl | 12 |
5 files changed, 692 insertions, 8 deletions
@@ -1,5 +1,5 @@ -C Get\sthe\sattach.test\sworking\son\swindows.\s(CVS\s1508) -D 2004-05-31T18:21:55 +C Begin\sadding\sdocumentation\sfor\sversion\s3.0.\s(CVS\s1509) +D 2004-05-31T18:22:26 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -184,14 +184,16 @@ F www/arch2.fig 613b5ac63511109064c2f93c5754ee662219937d F www/arch2.gif 49c6bb36160f03ca2b89eaa5bfb1f560c7d68ee7 F www/audit.tcl 90e09d580f79c7efec0c7d6f447b7ec5c2dce5c0 F www/c_interface.tcl 2176519fc2bd2d2cf6fe74fd806fc2d8362de2c8 +F www/capi3.tcl 79fec496d95e87420c40e4058f2685a6df2f93c7 F www/changes.tcl 9d562205db584d26b358ebe93fb58039feefd1b8 F www/common.tcl f786e6be86fb2627ceb30e770e9efa83b9c67a3a F www/conflict.tcl fb8a2ba83746c7fdfd9e52fa7f6aaf5c422b8246 F www/copyright-release.html 294e011760c439c44951a6bfecd4c81a1ae359e8 F www/copyright-release.pdf cfca3558fc97095e57c6117d08f1f5b80d95125a F www/copyright.tcl 82c9670c7ddb0311912ab7fe24703f33c531066c +F www/datatype3.tcl 3dcc0baaccc7d3bc28e12a3acc45f5ab7f723ca2 F www/datatypes.tcl 566004b81c36877397ddbe6e1907aae6065f6b41 -F www/docs.tcl 60a7ce60d6f04cd5f56ab9329e0ffc22ebd6f021 +F www/docs.tcl 5ea8a84edd33030879725fca85905899c89c7075 F www/download.tcl 8c84f15695c92cb01486930055fdf5192995f474 F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c F www/faq.tcl 3a1776818d9bd973ab0c3048ec7ad6b1ad091ae5 @@ -210,7 +212,7 @@ F www/support.tcl 67682848d6ddd283370451dc3da2e56cded9fc9a F www/tclsqlite.tcl 19191cf2a1010eaeff74c51d83fd5f5a4d899075 F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P 460f2361141f14aa709addd41cc011127bac9b6e -R e79cc292e6bccbc3d8d6727cae1981b6 +P 48226a73801bc478d6fd6de5a554aec5119d2194 +R 6c1a6ec8dae26e3de7139bd0ba98440c U drh -Z 90fe3d5148e97c78c1b08256539f671c +Z dd522c4899d9ea1abb58bb871bde4c24 diff --git a/manifest.uuid b/manifest.uuid index 2f37e7de0..d5c081aac 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -48226a73801bc478d6fd6de5a554aec5119d2194
\ No newline at end of file +2005bfdad03ac2aa70a82ba7ff9b2f469d129367
\ No newline at end of file diff --git a/www/capi3.tcl b/www/capi3.tcl new file mode 100644 index 000000000..8407c0dd7 --- /dev/null +++ b/www/capi3.tcl @@ -0,0 +1,364 @@ +set rcsid {$Id: capi3.tcl,v 1.1 2004/05/31 18:22:26 drh Exp $} +source common.tcl +header {C/C++ Interface For SQLite Version 3} +puts { +<h2>C/C++ Interface For SQLite Version 3</h2> + +<h3>1.0 Overview</h3> + +<p> +SQLite version 3.0 will be a new version of SQLite, derived from +the SQLite 2.8.13 code base, but with an incompatible file format +and API. +SQLite version 3.0 is intended to answer the increasing demand +for the following features: +</p> + +<ul> +<li>Support for UTF-16.</li> +<li>User-definable text collating sequences.</li> +<li>The ability to store BLOBs in indexed columns.</li> +</ul> + +<p> +It became necessary to move to version 3.0 +to implement these features because each +requires incompatible changes to the database file format. Other +incompatible changes, such as a cleanup of the API, were introduced +at the same time under the theory that it is best to get your +incompatible changes out of the way all at once. + +<p> +The API for version 3.0 is similar to the version 2.X API, +but with some important changes. Most noticeably, the "<tt>sqlite_</tt>" +prefix that occurs on the beginning of all API functions and data +structures will be changed to "<tt>sqlite3_</tt>". +This will avoid confusion between the two APIs and allow +linking against both SQLite 2.X and SQLite 3.0 at the same time, +if desired. +</p> + +<p> +There is no agreement on what the C datatype for a UTF-16 +string should be. Therefore, SQLite uses a generic type of void* +to refer to UTF-16 strings. +Client software can cast the void* +to whatever datatype is appropriate for their system. +</p> + +<h3>2.0 C/C++ Interface</h3> + +<h4>2.1 Opening and closing a database</h4> + +<blockquote><pre> + typedef struct sqlite3 sqlite3; + int sqlite3_open(const char*, sqlite3**, const char**); + int sqlite3_open16(const void*, sqlite3**, const char**); + int sqlite3_close(sqlite3*); + const char *sqlite3_errmsg(sqlite3*); + const void *sqlite3_errmsg16(sqlite3*); + int sqlite3_errcode(sqlite3*); +</pre></blockquote> + +<p> +The sqlite3_open() routine returns an integer error code rather than +a pointer to the sqlite3 structure. The difference between sqlite3_open() +and sqlite3_open16() is that sqlite3_open16() takes UTF-16 (in host native +byte order) for the name of the database file. If a new database file +needs to be created, then sqlite3_open16() will set the internal text +representation to UTF-16 whereas sqlite3_open() will set the text +representation to UTF-8. +</p> + +<p> +The third "const char**" argument to sqlite3_open() is a NULL-terminated +list of keyword/value pairs that define options to apply to the open +request. The third argument may be NULL if there are no options. +This extra argument provides an expandable way of supporting new features +in future releases. For example, a future release may contain an +option to define an encryption/decryption key. +</p> + +<p> +The sqlite3_errcode() routine will return the result code for the most +recent major API call. sqlite3_errmsg() will return an English-language +text error message for the most recent error. The error message will +be represented in UTF-8 and will be ephemeral - it could disappear on +the next call to any SQLite API function. sqlite3_errmsg16() works like +sqlite3_errmsg() except that it returns the error message represented +as UTF-16 in host native byte order. +</p> + +<h4>2.2 Executing SQL statements</h4> + +<blockquote><pre> + typedef struct sqlite3_stmt sqlite3_stmt; + int sqlite3_prepare(sqlite3*, const char*, sqlite3_stmt**, const char**); + int sqlite3_prepare16(sqlite3*, const void*, sqlite3_stmt**, const void**); + int sqlite3_finalize(sqlite3_stmt*); + int sqlite3_reset(sqlite3_stmt*); +</pre></blockquote> + +<p> +The non-callback API is now the preferred way of accessing the database. +Wrapper functions that emulate the older callback API may (or may not) +be provided. +</p> + +<p> +The sqlite3_prepare() function compiles an single SQL statement. +The statement may contain tokens of the form "?" or "?nnn" or ":nnn:" +where "nnn" is an integer. Such tokens represent unspecified literal values +(or wildcard) to be filled in later by the sqlite3_bind() API. +Each wildcard as an associated number given +by the "nnn" that follows the "?". If the "?" is not followed by an +integer, then its number one more than the number of prior wildcards +in the same SQL statement. It is allowed for the same wildcard +to occur more than once in the same SQL statement, in which case +all instance of that wildcard will be filled in with the same value. +Unbound wildcards have a value of NULL. +</p> + + +<p>The SQL statement is a UTF-8 string for sqlite3_prepare(). +The sqlite3_prepare16() works the same way except +that it expects a UTF-16 string as SQL input. +Only the first SQL statement in the input string is compiled. +The fourth parameter is filled in with a pointer to the next (uncompiled) +SQLite statement in the input string, if any. +The sqlite3_finalize() routine deallocates a prepared SQL statement. +The sqlite3_reset() routine resets a prepared SQL statement so that it +can be executed again. +</p> + +<blockquote><pre> + int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, int eCopy); + int sqlite3_bind_double(sqlite3_stmt*, int, double); + int sqlite3_bind_int(sqlite3_stmt*, int, int); + int sqlite3_bind_int64(sqlite3_stmt*, int, long long int); + int sqlite3_bind_null(sqlite3_stmt*, int); + int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, int eCopy); + int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int n, int eCopy); + int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +</pre></blockquote> + +<p> +There is an assortment of sqlite3_bind routines used to assign values +to wildcards in a prepared SQL statement. Unbound wildcards +are interpreted as NULLs. Bindings are not reset by sqlite3_reset(). +But wildcards can be rebound to new values after an sqlite3_reset(). +</p> + +<p> +After an SQL statement has been prepared (and optionally bound), it +is executed using: +</p> + +<blockquote><pre> + int sqlite3_step(sqlite3_stmt*); +</pre></blockquote> + +<p> +The sqlite3_step() routine return SQLITE3_ROW if it is returning a single +row of the result set, or SQLITE3_DONE if execution has completed, either +normally or due to an error. It might also return SQLITE3_BUSY if it is +unable to open the database file. If the return value is SQLITE3_ROW, then +the following routines can be used to extract information about that row +of the result set: +</p> + +<blockquote><pre> + int sqlite3_column_count(sqlite3_stmt*); + int sqlite3_column_type(sqlite3_stmt*,int); + const char *sqlite3_column_decltype(sqlite3_stmt *, int i); + const char *sqlite3_column_decltype16(sqlite3_stmt *, int i); + const char *sqlite3_column_name(sqlite3_stmt*,int); + const void *sqlite3_column_name16(sqlite3_stmt*,int); + const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); + int sqlite3_column_bytes(sqlite3_stmt*, int iCol); + int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); + double sqlite3_column_double(sqlite3_stmt*, int iCol); + int sqlite3_column_int(sqlite3_stmt*, int iCol); + long long int sqlite3_column_int64(sqlite3_stmt*, int iCol); + const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); + const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); + int sqlite3_column_type(sqlite3_stmt*, int iCol); +</pre></blockquote> + +<p> +The sqlite3_column_count() function returns the number of columns in +the results set. The sqlite3_column_type() function returns the +datatype for the value in the Nth column. The return value is one +of these: +</p> + +<blockquote><pre> + #define SQLITE3_INTEGER 1 + #define SQLITE3_FLOAT 2 + #define SQLITE3_TEXT 3 + #define SQLITE3_BLOB 4 + #define SQLITE3_NULL 5 +</pre></blockquote> + +<p> +The sqlite3_column_decltype() routine returns text which is the +declared type of the column in the CREATE TABLE statement. For an +expression, the return type is an empty string. sqlite3_column_name() +returns the name of the Nth column. sqlite3_column_bytes() returns +the number of bytes in a column that has type BLOB or the number of bytes +in a TEXT string with UTF-8 encoding. sqlite3_column_bytes16() returns +the same value for BLOBs but for TEXT strings returns the number of bytes +in a UTF-16 encoding. +sqlite3_column_blob() return BLOB data. +sqlite3_column_text() return TEXT data as UTF-8. +sqlite3_column_text16() return TEXT data as UTF-16. +sqlite3_column_int() return INTEGER data in the host machines native +integer format. +sqlite3_column_int64() returns 64-bit INTEGER data. +Finally, sqlite3_column_double() return floating point data. +</p> + +<h4>2.3 User-defined functions</h4> + +<p> +User defined functions can be created using the following routine: +</p> + +<blockquote><pre> + typedef struct sqlite3_value sqlite3_value; + int sqlite3_create_function( + sqlite3 *, + const char *zFunctionName, + int nArg, + int eTextRep, + int iCollateArg, + void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) + ); + int sqlite3_create_function16( + sqlite3*, + const void *zFunctionName, + int nArg, + int eTextRep, + int iCollateArg, + void*, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) + ); + #define SQLITE3_UTF8 1 + #define SQLITE3_UTF16LE 2 + #define SQLITE3_UTF16BE 3 + #define SQLITE3_ANY 4 +</pre></blockquote> + +<p> +The nArg parameter specifies the number of arguments to the function. +A value of 0 indicates that any number of arguments is allowed. The +eTextRep parameter specifies what representation text values are expected +to be in for arguments to this function. The value of this parameter should +be one of the parameters defined above. SQLite version 3 allows multiple +implementations of the same function using different text representations. +The database engine chooses the function that minimization the number +of text conversions required. +The iCollateArg parameter indicates that the collating sequence for the +result is to be the same as the collating sequence of the iCollateArg-th +parameter. +</p> + +<p> +Normal functions specify only xFunc and leave xStep and xFinal set to NULL. +Aggregate functions specify xStep and xFinal and leave xFunc set to NULL. +There is no separate sqlite3_create_aggregate() API. +</p> + +<p> +The function name is specified in UTF-8. A separate sqlite3_create_function16() +API works the same as sqlite_create_function() +except that the function name is specified in UTF-16 host byte order. +</p> + +<p> +Notice that the parameters to functions are now pointers to sqlite3_value +structures instead of pointers to strings as in SQLite version 2.X. +The following routines are used to extract useful information from these +"values": +</p> + +<blockquote><pre> + const void *sqlite3_value_blob(sqlite3_value*); + int sqlite3_value_bytes(sqlite3_value*); + int sqlite3_value_bytes16(sqlite3_value*); + double sqlite3_value_double(sqlite3_value*); + int sqlite3_value_int(sqlite3_value*); + long long int sqlite3_value_int64(sqlite3_value*); + const unsigned char *sqlite3_value_text(sqlite3_value*); + const void *sqlite3_value_text16(sqlite3_value*); + int sqlite3_value_type(sqlite3_value*); +</pre></blockquote> + +<p> +Function implementations use the following APIs to acquire context and +to report results: +</p> + +<blockquote><pre> + void *sqlite3_aggregate_context(sqlite3_context*, int nbyte); + void *sqlite3_user_data(sqlite3_context*); + void sqlite3_result_blob(sqlite3_context*, const void*, int n, int eCopy); + void sqlite3_result_double(sqlite3_context*, double); + void sqlite3_result_error(sqlite3_context*, const char*, int); + void sqlite3_result_error16(sqlite3_context*, const void*, int); + void sqlite3_result_int(sqlite3_context*, int); + void sqlite3_result_int64(sqlite3_context*, long long int); + void sqlite3_result_null(sqlite3_context*); + void sqlite3_result_text(sqlite3_context*, const char*, int n, int eCopy); + void sqlite3_result_text16(sqlite3_context*, const void*, int n, int eCopy); + void sqlite3_result_value(sqlite3_context*, sqlite3_value*); + void *sqlite3_get_auxdata(sqlite3_context*, int); + void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*)); +</pre></blockquote> + +<h4>2.4 User-defined collating sequences</h4> + +<p> +The following routines are used to implement user-defined +collating sequences: +</p> + +<blockquote><pre> + sqlite3_create_collation(sqlite3*, const char *zName, int eTextRep, void*, + int(*xCompare)(void*,int,const void*,int,const void*)); + sqlite3_create_collation16(sqlite3*, const void *zName, int eTextRep, void*, + int(*xCompare)(void*,int,const void*,int,const void*)); + sqlite3_collation_needed(sqlite3*, void*, + void(*)(void*,sqlite3*,int eTextRep,const char*)); + sqlite3_collation_needed16(sqlite3*, void*, + void(*)(void*,sqlite3*,int eTextRep,const void*)); +</pre></blockquote> + +<p> +The sqlite3_create_collation() function specifies a collating sequence name +and a comparison function to implement that collating sequence. The +comparison function is only used for comparing text values. The eTextRep +parameter is one of SQLITE3_UTF8, SQLITE3_UTF16LE, SQLITE3_UTF16BE, or +SQLITE3_ANY to specify which text representation to comparison function works +with. Separate comparison functions can exist for the same collating +sequence for each of the UTF-8, UTF-16LE and UTF-16BE text representations. +The sqlite3_create_collation16() works like sqlite3_create_collation() except +that the collation name is specified in UTF-16 host byte order instead of +in UTF-8. +</p> + +<p> +The sqlite3_collation_needed() routine registers a callback which the +database engine will invoke if it encounters an unknown collating sequence. +The callback can lookup an appropriate comparison function and invoke +sqlite_3_create_collation() as needed. The fourth parameter to the callback +is the name of the collating sequence in UTF-8. For sqlite3_collation_need16() +the callback sends the collating sequence name in UTF-16 host byte order. +</p> +} +footer $rcsid diff --git a/www/datatype3.tcl b/www/datatype3.tcl new file mode 100644 index 000000000..637199c12 --- /dev/null +++ b/www/datatype3.tcl @@ -0,0 +1,308 @@ +set rcsid {$Id: datatype3.tcl,v 1.1 2004/05/31 18:22:26 drh Exp $} +source common.tcl +header {Datatypes In SQLite Version 3} +puts { +<h2>Datatypes In SQLite Version 3</h2> + +<h3>1. Storage Classes</h3> + +<P>Version 2 of SQLite stores all column values as ASCII text. +Version 3 enhances this by providing the ability to store integer and +real numbers in a more compact format and the capability to store +BLOB data.</P> + +<P>Each value stored in an SQLite database (or manipulated by the +database engine) has one of the following storage classes:</P> +<UL> + <LI><P><B>NULL</B>. The value is a NULL value.</P> + <LI><P><B>INTEGER</B>. The value is a signed integer, stored in 1, + 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.</P> + <LI><P><B>REAL</B>. The value is a floating point value, stored as + an 8-byte IEEE floating point number.</P> + <LI><P><B>TEXT</B>. The value is a text string, stored using the + database encoding (UTF-8, UTF-16BE or UTF-16-LE).</P> + <LI><P><B>BLOB</B>. The value is a blob of data, stored exactly as + it was input.</P> +</UL> + +<P>As in SQLite version 2, any column in a version 3 database except an INTEGER +PRIMARY KEY may be used to store any type of value. The exception to +this rule is described below under 'Strict Affinity Mode'.</P> + +<P>All values supplied to SQLite, whether as literals embedded in SQL +statements or values bound to pre-compiled SQL statements +are assigned a storage class before the SQL statement is executed. +Under circumstances described below, the +database engine may convert values between numeric storage classes +(INTEGER and REAL) and TEXT during query execution. +</P> + +<P>Storage classes are initially assigned as follows:</P> +<UL> + <LI><P>Values specified as literals as part of SQL statements are + assigned storage class TEXT if they are enclosed by single or double + quotes, INTEGER if the literal is specified as an unquoted number + with no decimal point or exponent, REAL if the literal is an + unquoted number with a decimal point or exponent and NULL if the + value is a NULL.</P> + <LI><P>Values supplied using the sqlite3_bind_* APIs are assigned + the storage class that most closely matches the native type bound + (i.e. sqlite3_bind_blob() binds a value with storage class BLOB).</P> +</UL> +<P>The storage class of a value that is the result of an SQL scalar +operator depends on the outermost operator of the expression. +User-defined functions may return values with any storage class. It +is not generally possible to determine the storage class of the +result of an expression at compile time.</P> + +<h3>2. Column Affinity</h3> + +<p> +In SQLite version 3, the type of a value is associated with the value +itself, not with the column or variable in which the value is stored. +(This is sometimes called +<a href="http://www.cliki.net/manifest%20type%50system"> +manifest typing</a>.) +All other SQL databases engines that we are aware of use the more +restrict system of static typing where the type is associated with +the container, not the value. +</p> + +<p> +In order to maximize compatibility between SQLite and other database +engines, SQLite support the concept of "type affinity" on columns. +The type affinity of a column is the recommended type for data stored +in that column. The key here is that the type is recommended, not +required. Any column can still store any type of data, in theory. +It is just that some columns, given the choice, will prefer to use +one storage class over another. The preferred storage class for +a column is called its "affinity". +</p> + +<P>Each column in an SQLite 3 database is assigned one of the +following type affinities:</P> +<UL> + <LI><P>TEXT.</P> + <LI><P>NUMERIC.</P> + <LI><P>INTEGER.</P> + <LI><P>NONE.</P> +</UL> + +<P>A column with TEXT affinity stores all data using storage classes +NULL, TEXT or BLOB. If numerical data is inserted into a column with +TEXT affinity it is converted to text form before being stored.</P> + +<P>A column with NUMERIC affinity may contain values using all five +storage classes. When text data is inserted into a NUMERIC column, an +attempt is made to convert it to an integer or real number before it +is stored. If the conversion is successful, then the value is stored +using the INTEGER or REAL storage class. If the conversion cannot be +performed the value is stored using the TEXT storage class. No +attempt is made to convert NULL or blob values.</P> + +<P>A column that uses INTEGER affinity behaves in the same way as a +column with NUMERIC affinity, except that if a real value with no +floating point component (or text value that converts to such) is +inserted it is converted to an integer and stored using the INTEGER +storage class.</P> + +<P>A column with affinity NONE does not prefer one storage class over +another. It makes no attempt to coerce data before +it is inserted.</P> + +<h4>2.1 Determination Of Column Affinity</h4> + +<P>The type affinity of a column is determined by the declared type +of the column, according to the following rules:</P> +<OL> + <LI><P>If the datatype contains the string "INT" then it + is assigned INTEGER affinity.</P> + + <LI><P>If the datatype of the column contains any of the strings + "CHAR", "CLOB", or "TEXT" then that + column has TEXT affinity. Notice that the type VARCHAR contains the + string "CHAR" and is thus assigned TEXT affinity.</P> + + <LI><P>If the datatype contains the string "BLOB" + then the column has affinity NONE.</P> + + <LI><P>Otherwise, the affinity is NUMERIC. Notice that a column + where no datatype is specified is given affinity NUMERIC.</P> +</OL> + +<P>If a table is created using a "CREATE TABLE <table> AS +SELECT..." statement, then all columns have no datatype specified +and they are given no affinity.</P> + +<h4>2.2 Column Affinity Example</h4> + +<blockquote> +<PRE>CREATE TABLE t1( + t AFFINITY TEXT, + nu AFFINITY NUMERIC, + i AFFINITY INTEGER, + no AFFINITY NONE +); + +-- Storage classes for the following row: +-- TEXT, REAL, INTEGER, TEXT +INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0'); + +-- Storage classes for the following row: +-- TEXT, REAL, INTEGER, REAL +INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0);</PRE> +</blockquote> + +<h3>3. Comparison Expressions</h3> + +<P>Like SQLite version 2, version 3 +features the binary comparison operators '=', +'<', '<=', '>=' and '!=', an operation to test for set +membership, 'IN', and the ternary comparison operator 'BETWEEN'.</P> +<P>The results of a comparison depend on the storage classes of the +two values being compared, according to the following rules:</P> +<UL> + <LI><P>A value with storage class NULL is considered less than any + other value (including another value with storage class NULL).</P> + + <LI><P>An INTEGER or REAL value is less than any TEXT or BLOB value. + When an INTEGER or REAL is compared to another INTEGER or REAL, a + numerical comparison is performed.</P> + + <LI><P>A TEXT value is less than a BLOB value. When two TEXT values + are compared, the C library function memcmp() is usually used to + determine the result. However this can be overriden, as described + under 'User-defined collation Sequences' below.</P> + + <LI><P>When two BLOB values are compared, the result is always + determined using memcmp().</P> +</UL> + +<P>SQLite may attempt to convert values between the numeric storage +classes (INTEGER and REAL) and TEXT before performing a comparison. +For binary comparisons, this is done in the cases enumerated below. +The term “expression” used in the bullet points below means any +SQL scalar expression or literal other than a column value.</P> +<UL> + <LI><P>When a column value is compared to the result of an + expression, the affinity of the column is applied to the result of + the expression before the comparison takes place.</P> + + <LI><P>When two column values are compared, if one column has + INTEGER or NUMERIC affinity and the other does not, the NUMERIC + affinity is applied to any values with storage class TEXT extracted + from the non-NUMERIC column.</P> + + <LI><P>When the results of two expressions are compared, the NUMERIC + affinity is applied to both values before the comparison takes + place.</P> +</UL> + +<h4>3.1 Comparison Example</h4> + +<blockquote> +<PRE>CREATE TABLE t1( + a AFFINITY TEXT, + b AFFINITY NUMERIC, + c AFFINITY NONE +); + +-- Storage classes for the following row: +-- TEXT, REAL, TEXT +INSERT INTO t1 VALUES('500', '500', '500'); + +-- 60 and 40 are converted to “60” and “40” and values are compared as TEXT. +SELECT a < 60, a < 40 FROM t1; +1|0 + +-- Comparisons are numeric. No conversions are required. +SELECT b < 60, b < 600 FROM t1; +0|1 + +-- Both 60 and 600 (storage class NUMERIC) are less than '500' (storage class TEXT). +SELECT c < 60, c < 600 FROM t1; +0|0</PRE> +</blockquote> + +<P> +In SQLite, the expression "a BETWEEN b AND c" is currently +equivalent to "a >= b AND a <= c". SQLite will continue to +treat the two as exactly equivalent, even if this means that +different affinities are applied to 'a' in each of the comparisons +required to evaluate the expression.</P> +<P>Expressions of the type "a IN (SELECT b ....)" are handled by +the three rules enumerated above for binary comparisons (e.g. in a +similar manner to "a = b"). For example if 'b' is a column value +and 'a' is an expression, then the affinity of 'b' is applied to 'a' +before any comparisons take place.</P> + +<P>SQLite currently treats the expression "a IN (x, y, z)" as +equivalent to "a = z OR a = y OR a = z". SQLite will continue to +treat the two as exactly equivalent, even if this means that +different affinities are applied to 'a' in each of the comparisons +required to evaluate the expression.</P> + +<h3>4. Operators</h3> + +<P>All mathematical operators (which is to say, all operators other +than the concatenation operator "||") apply NUMERIC +affinity to all operands prior to being carried out. If one or both +operands cannot be converted to NUMERIC then the result of the +operation is NULL.</P> + +<P>For the concatenation operator, TEXT affinity is applied to both +operands. If either operand cannot be converted to TEXT (because it +is NULL or a BLOB) then the result of the concatenation is NULL.</P> + +<h3>5. Sorting, Grouping and Compound SELECTs</h3> + +<P>When values are sorted by an ORDER by clause, values with storage +class NULL come first, followed by INTEGER and REAL values +interspersed in numeric order, followed by TEXT values usually in +memcmp() order, and finally BLOB values in memcmp() order. No storage +class conversions occur before the sort.</P> + +<P>When grouping values with the GROUP BY clause values with +different storage classes are considered distinct, except for INTEGER +and REAL values which are considered equal if they are numerically +equal. No affinities are applied to any values as the result of a +GROUP by clause.</P> + +<P>The compound SELECT operators UNION, +INTERSECT and EXCEPT perform implicit comparisons between values. +Before these comparisons are performed an affinity may be applied to +each value. The same affinity, if any, is applied to all values that +may be returned in a single column of the compound SELECT result set. +The affinity applied is the affinity of the column returned by the +left most component SELECTs that has a column value (and not some +other kind of expression) in that position. If for a given compound +SELECT column none of the component SELECTs return a column value, no +affinity is applied to the values from that column before they are +compared.</P> + +<h3>6. Other Affinity Modes</h3> + +<P>The above sections describe the operation of the database engine +in 'normal' affinity mode. SQLite version 3 will feature two other affinity +modes, as follows:</P> +<UL> + <LI><P><B>Strict affinity</B> mode. In this mode if a conversion + between storage classes is ever required, the database engine + returns an error and the current statement is rolled back.</P> + + <LI><P><B>No affinity</B> mode. In this mode no conversions between + storage classes are ever performed. Comparisons between values of + different storage classes (except for INTEGER and REAL) are always + false.</P> +</UL> + +<h3>7. User-defined Collation Sequences</h3> + +<P>By default, when SQLite compares two +text values, the result of the comparison is determined using +memcmp(), regardless of the encoding of the string. SQLite v3 +provides the ability for users to supply arbitrary comparison +functions, known as user-defined collation sequences, to be used +instead of memcmp().</P> +} +footer $rcsid diff --git a/www/docs.tcl b/www/docs.tcl index 8e9dad66d..f54416a2e 100644 --- a/www/docs.tcl +++ b/www/docs.tcl @@ -1,7 +1,7 @@ # This script generates the "docs.html" page that describes various # sources of documentation available for SQLite. # -set rcsid {$Id: docs.tcl,v 1.1 2004/05/31 15:06:30 drh Exp $} +set rcsid {$Id: docs.tcl,v 1.2 2004/05/31 18:22:26 drh Exp $} source common.tcl header {SQLite Documentation} puts { @@ -28,6 +28,10 @@ doc {Version 2 C/C++ API} {c_interface.html} { A description of the C/C++ interface bindings for SQLite through version 2.8 } +doc {Version 3 C/C++ API} {capi3.html} { + A description of the C/C++ interface bindings for SQLite version 3.0.0 + and following. +} doc {Tcl API} {tclsqlite.html} { A description of the TCL interface bindings for SQLite. @@ -36,6 +40,12 @@ doc {Tcl API} {tclsqlite.html} { doc {Version 2 DataTypes } {datatypes.html} { A description of how SQLite version 2 handles SQL datatypes. } +doc {Version 3 DataTypes } {datatype3.html} { + SQLite version 3 introduces the concept of manifest typing, where the + type of a value is associated with the value itself, not the column that + it is stored in. + This page describes data typing for SQLite version 3 in further detail. +} doc {Release History} {changes.html} { A chronology of SQLite releases going back to version 1.0.0 |