mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
file format change (CVS 120)
FossilOrigin-Name: 67f8af377c8a92ac155f55afc75e9957bec4e787
This commit is contained in:
24
manifest
24
manifest
@ -1,5 +1,5 @@
|
|||||||
C fix\sparser\sstack\soverflow\s(CVS\s119)
|
C file\sformat\schange\s(CVS\s120)
|
||||||
D 2000-08-01T09:56:27
|
D 2000-08-02T12:26:29
|
||||||
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
|
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
|
||||||
F Makefile.in 670aa9413cb2cdcded23b328a9e255c845c41a1e
|
F Makefile.in 670aa9413cb2cdcded23b328a9e255c845c41a1e
|
||||||
F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958
|
F README 51f6a4e7408b34afa5bc1c0485f61b6a4efb6958
|
||||||
@ -7,7 +7,7 @@ F configure 51063d594190fa085f909cefc9427241088bec4f x
|
|||||||
F configure.in a04f02ba61ed09a00e862b4f78b91b06a559e0b5
|
F configure.in a04f02ba61ed09a00e862b4f78b91b06a559e0b5
|
||||||
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
|
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
|
||||||
F src/build.c ecb8ec724914780efed01d1739e6dd398d75af46
|
F src/build.c ecb8ec724914780efed01d1739e6dd398d75af46
|
||||||
F src/dbbe.c 1bc12590063a21e6098503b5821df87da20c1d8f
|
F src/dbbe.c 5c69d68fe8d9461e56d066f9a7f693636c02d0c7
|
||||||
F src/dbbe.h 8718b718b36d37584e9bbdfccec10588fa91271f
|
F src/dbbe.h 8718b718b36d37584e9bbdfccec10588fa91271f
|
||||||
F src/delete.c 4d491eaf61b515516749c7ed68fa3b2ee8a09065
|
F src/delete.c 4d491eaf61b515516749c7ed68fa3b2ee8a09065
|
||||||
F src/expr.c 2fa63f086707176d09092e71832f9bbdc6a8ac85
|
F src/expr.c 2fa63f086707176d09092e71832f9bbdc6a8ac85
|
||||||
@ -17,12 +17,12 @@ F src/parse.y 5d199034de5d29ebedb42c1c51f34db4df40cbe5
|
|||||||
F src/select.c d382e96c2221d08367cc87976f2b574537c9de97
|
F src/select.c d382e96c2221d08367cc87976f2b574537c9de97
|
||||||
F src/shell.c a5eb8ee9d5f90e735900a92e7fc364a54deb2cfb
|
F src/shell.c a5eb8ee9d5f90e735900a92e7fc364a54deb2cfb
|
||||||
F src/sqlite.h 82ae53028e27919250f886ff9d7c4927de81978a
|
F src/sqlite.h 82ae53028e27919250f886ff9d7c4927de81978a
|
||||||
F src/sqliteInt.h 74eb0e266e05d10278e2c20a2cd8fe9fd9fa0d1a
|
F src/sqliteInt.h cbb973ffcbbefdfb59438fa5c1df0be768cc490c
|
||||||
F src/tclsqlite.c 9f358618ae803bedf4fb96da5154fd45023bc1f7
|
F src/tclsqlite.c 9f358618ae803bedf4fb96da5154fd45023bc1f7
|
||||||
F src/tokenize.c 77ff8164a8751994bc9926ce282847f653ac0c16
|
F src/tokenize.c 77ff8164a8751994bc9926ce282847f653ac0c16
|
||||||
F src/update.c 51b9ef7434b15e31096155da920302e9db0d27fc
|
F src/update.c 51b9ef7434b15e31096155da920302e9db0d27fc
|
||||||
F src/util.c b75b33e6bd5d47898bb7ed9fdd0dea4fe7c19b00
|
F src/util.c b75b33e6bd5d47898bb7ed9fdd0dea4fe7c19b00
|
||||||
F src/vdbe.c 4308e226d5b33a72dfe2c88a44eb0a63381fe24b
|
F src/vdbe.c bdedf21230581f0cf73a2dcd8fe23f30cf30ebe6
|
||||||
F src/vdbe.h 6c5653241633c583549c2d8097394ab52550eb63
|
F src/vdbe.h 6c5653241633c583549c2d8097394ab52550eb63
|
||||||
F src/where.c 420f666a38b405cd58bd7af832ed99f1dbc7d336
|
F src/where.c 420f666a38b405cd58bd7af832ed99f1dbc7d336
|
||||||
F test/all.test 0950c135cab7e60c07bd745ccfad1476211e5bd7
|
F test/all.test 0950c135cab7e60c07bd745ccfad1476211e5bd7
|
||||||
@ -31,7 +31,7 @@ F test/dbbe.test 0a8e4293cf816e590dcbb01be4cd4e8f7f95bdc8
|
|||||||
F test/delete.test 402ee3ccb6e544582d24c573ef70b34d09583ae7
|
F test/delete.test 402ee3ccb6e544582d24c573ef70b34d09583ae7
|
||||||
F test/expr.test 09b55ccf81cb8cc2f9cd83d592a2ba187ee48ba8
|
F test/expr.test 09b55ccf81cb8cc2f9cd83d592a2ba187ee48ba8
|
||||||
F test/in.test 2c560c0f55fb777029fd9bb5378f2997582aa603
|
F test/in.test 2c560c0f55fb777029fd9bb5378f2997582aa603
|
||||||
F test/index.test 620ceab7165dd078d1266bdc2cac6147f04534ac
|
F test/index.test e5f4e7ad41e1709ef4426a3a4ce1bafe1afe1ee4
|
||||||
F test/insert.test 66f4c3bd600fec8eb1e733b928cbe6fa885eff0c
|
F test/insert.test 66f4c3bd600fec8eb1e733b928cbe6fa885eff0c
|
||||||
F test/insert2.test 732405e30331635af8d159fccabe835eea5cd0c6
|
F test/insert2.test 732405e30331635af8d159fccabe835eea5cd0c6
|
||||||
F test/lock.test 42a2d171eba1078cf3fd58ab64241eb8f1b08d69
|
F test/lock.test 42a2d171eba1078cf3fd58ab64241eb8f1b08d69
|
||||||
@ -59,16 +59,16 @@ F www/arch.fig 4e26e9dca3c49724fc8f554c695ddea9f2413156
|
|||||||
F www/arch.png c4d908b79065a72e7dcf19317f36d1324c550e87
|
F www/arch.png c4d908b79065a72e7dcf19317f36d1324c550e87
|
||||||
F www/arch.tcl 4f6a9afecc099a27bba17b4f8cc9561abc15dc40
|
F www/arch.tcl 4f6a9afecc099a27bba17b4f8cc9561abc15dc40
|
||||||
F www/c_interface.tcl 29593cf77025bab137b7ba64b9459eb5eb6b4873
|
F www/c_interface.tcl 29593cf77025bab137b7ba64b9459eb5eb6b4873
|
||||||
F www/changes.tcl bfd60af0af1cd81030a14dd072fb0214f44b1470
|
F www/changes.tcl 0fe8d43635dd08a01479774520f54149550cdb74
|
||||||
F www/crosscompile.tcl 19734ce7f18b16ff2ed8479412abf8aca56e1dcc
|
F www/crosscompile.tcl 19734ce7f18b16ff2ed8479412abf8aca56e1dcc
|
||||||
F www/fileformat.tcl f3a70650e942262f8285d53097d48f0b3aa59862
|
F www/fileformat.tcl 1c353d202cc75de55a916a1bab80e7b3cc5660ee
|
||||||
F www/index.tcl 8043911df3baacc5be42c40c9bd0883602e8a63a
|
F www/index.tcl ae93e74540d9198743009fe5a60b7c2c2e7885d6
|
||||||
F www/lang.tcl 1645e9107d75709be4c6099b643db235bbe0a151
|
F www/lang.tcl 1645e9107d75709be4c6099b643db235bbe0a151
|
||||||
F www/mingw.tcl fc5f4ba9d336b6e8c97347cc6496d6162461ef60
|
F www/mingw.tcl fc5f4ba9d336b6e8c97347cc6496d6162461ef60
|
||||||
F www/opcode.tcl cb3a1abf8b7b9be9f3a228d097d6bf8b742c2b6f
|
F www/opcode.tcl cb3a1abf8b7b9be9f3a228d097d6bf8b742c2b6f
|
||||||
F www/sqlite.tcl 69781eaffb02e17aa4af28b76a2bedb19baa8e9f
|
F www/sqlite.tcl 69781eaffb02e17aa4af28b76a2bedb19baa8e9f
|
||||||
F www/vdbe.tcl bcbfc33bcdd0ebad95eab31286adb9e1bc289520
|
F www/vdbe.tcl bcbfc33bcdd0ebad95eab31286adb9e1bc289520
|
||||||
P 4132d4760f6a2cbcf853f82546987d932e76e3c1
|
P bffca90f37a69c5bd26b719a964408e0e518a7dc
|
||||||
R 463a993a466cf480cd166cfd852b8351
|
R fb9083cf992b9bf32aa0798cc17db2e1
|
||||||
U drh
|
U drh
|
||||||
Z 9d9beee969b260700b91790c5774a3ef
|
Z b90780147dd290d806a672cbfe65d916
|
||||||
|
@ -1 +1 @@
|
|||||||
bffca90f37a69c5bd26b719a964408e0e518a7dc
|
67f8af377c8a92ac155f55afc75e9957bec4e787
|
@ -30,7 +30,7 @@
|
|||||||
** relatively simple to convert to a different database such
|
** relatively simple to convert to a different database such
|
||||||
** as NDBM, SDBM, or BerkeleyDB.
|
** as NDBM, SDBM, or BerkeleyDB.
|
||||||
**
|
**
|
||||||
** $Id: dbbe.c,v 1.17 2000/07/31 13:38:26 drh Exp $
|
** $Id: dbbe.c,v 1.18 2000/08/02 12:26:29 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <gdbm.h>
|
#include <gdbm.h>
|
||||||
@ -629,6 +629,7 @@ int sqliteDbbeNew(DbbeCursor *pCursr){
|
|||||||
for(i=0; i<4; i++){
|
for(i=0; i<4; i++){
|
||||||
iKey = (iKey<<8) + rc4byte(pRc4);
|
iKey = (iKey<<8) + rc4byte(pRc4);
|
||||||
}
|
}
|
||||||
|
if( iKey==0 ) continue;
|
||||||
key.dptr = (char*)&iKey;
|
key.dptr = (char*)&iKey;
|
||||||
key.dsize = 4;
|
key.dsize = 4;
|
||||||
go = gdbm_exists(pCursr->pFile->dbf, key);
|
go = gdbm_exists(pCursr->pFile->dbf, key);
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** Internal interface definitions for SQLite.
|
** Internal interface definitions for SQLite.
|
||||||
**
|
**
|
||||||
** @(#) $Id: sqliteInt.h,v 1.27 2000/07/29 13:06:59 drh Exp $
|
** @(#) $Id: sqliteInt.h,v 1.28 2000/08/02 12:26:29 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqlite.h"
|
#include "sqlite.h"
|
||||||
#include "dbbe.h"
|
#include "dbbe.h"
|
||||||
@ -123,7 +123,7 @@ struct sqlite {
|
|||||||
Dbbe *pBe; /* The backend driver */
|
Dbbe *pBe; /* The backend driver */
|
||||||
int flags; /* Miscellanous flags */
|
int flags; /* Miscellanous flags */
|
||||||
void *pBusyArg; /* 1st Argument to the busy callback */
|
void *pBusyArg; /* 1st Argument to the busy callback */
|
||||||
int (*xBusyCallback)(void *,const char*,int);
|
int (*xBusyCallback)(void *,const char*,int); /* The busy callback */
|
||||||
Table *apTblHash[N_HASH]; /* All tables of the database */
|
Table *apTblHash[N_HASH]; /* All tables of the database */
|
||||||
Index *apIdxHash[N_HASH]; /* All indices of the database */
|
Index *apIdxHash[N_HASH]; /* All indices of the database */
|
||||||
};
|
};
|
||||||
|
70
src/vdbe.c
70
src/vdbe.c
@ -41,7 +41,7 @@
|
|||||||
** But other routines are also provided to help in building up
|
** But other routines are also provided to help in building up
|
||||||
** a program instruction by instruction.
|
** a program instruction by instruction.
|
||||||
**
|
**
|
||||||
** $Id: vdbe.c,v 1.37 2000/07/30 20:04:43 drh Exp $
|
** $Id: vdbe.c,v 1.38 2000/08/02 12:26:29 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -2143,17 +2143,23 @@ int sqliteVdbeExec(
|
|||||||
if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
||||||
int *aIdx;
|
int *aIdx;
|
||||||
int nIdx;
|
int nIdx;
|
||||||
int j;
|
int j, k;
|
||||||
nIdx = sqliteDbbeDataLength(pCrsr)/sizeof(int);
|
nIdx = sqliteDbbeDataLength(pCrsr)/sizeof(int);
|
||||||
aIdx = (int*)sqliteDbbeReadData(pCrsr, 0);
|
aIdx = (int*)sqliteDbbeReadData(pCrsr, 0);
|
||||||
for(j=p->aCsr[i].index; j<nIdx; j++){
|
if( nIdx>1 ){
|
||||||
|
k = *(aIdx++);
|
||||||
|
if( k>nIdx-1 ) k = nIdx-1;
|
||||||
|
}else{
|
||||||
|
k = nIdx;
|
||||||
|
}
|
||||||
|
for(j=p->aCsr[i].index; j<k; j++){
|
||||||
if( aIdx[j]!=0 ){
|
if( aIdx[j]!=0 ){
|
||||||
p->aStack[tos].i = aIdx[j];
|
p->aStack[tos].i = aIdx[j];
|
||||||
p->aStack[tos].flags = STK_Int;
|
p->aStack[tos].flags = STK_Int;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( j>=nIdx ){
|
if( j>=k ){
|
||||||
j = -1;
|
j = -1;
|
||||||
pc = pOp->p2 - 1;
|
pc = pOp->p2 - 1;
|
||||||
PopStack(p, 1);
|
PopStack(p, 1);
|
||||||
@ -2193,14 +2199,38 @@ int sqliteVdbeExec(
|
|||||||
/* Extend the existing record */
|
/* Extend the existing record */
|
||||||
int nIdx;
|
int nIdx;
|
||||||
int *aIdx;
|
int *aIdx;
|
||||||
|
int k;
|
||||||
|
|
||||||
nIdx = sqliteDbbeDataLength(pCrsr)/sizeof(int);
|
nIdx = sqliteDbbeDataLength(pCrsr)/sizeof(int);
|
||||||
aIdx = sqliteMalloc( sizeof(int)*(nIdx+1) );
|
if( nIdx==1 ){
|
||||||
if( aIdx==0 ) goto no_mem;
|
aIdx = sqliteMalloc( sizeof(int)*4 );
|
||||||
sqliteDbbeCopyData(pCrsr, 0, nIdx*sizeof(int), (char*)aIdx);
|
if( aIdx==0 ) goto no_mem;
|
||||||
aIdx[nIdx] = newVal;
|
aIdx[0] = 2;
|
||||||
sqliteDbbePut(pCrsr, p->aStack[tos].n, p->zStack[tos],
|
sqliteDbbeCopyData(pCrsr, 0, sizeof(int), (char*)&aIdx[1]);
|
||||||
sizeof(int)*(nIdx+1), (char*)aIdx);
|
aIdx[2] = newVal;
|
||||||
sqliteFree(aIdx);
|
sqliteDbbePut(pCrsr, p->aStack[tos].n, p->zStack[tos],
|
||||||
|
sizeof(int)*4, (char*)aIdx);
|
||||||
|
sqliteFree(aIdx);
|
||||||
|
}else{
|
||||||
|
aIdx = (int*)sqliteDbbeReadData(pCrsr, 0);
|
||||||
|
k = aIdx[0];
|
||||||
|
if( k<nIdx-1 ){
|
||||||
|
aIdx[k+1] = newVal;
|
||||||
|
aIdx[0]++;
|
||||||
|
sqliteDbbePut(pCrsr, p->aStack[tos].n, p->zStack[tos],
|
||||||
|
sizeof(int)*nIdx, (char*)aIdx);
|
||||||
|
}else{
|
||||||
|
nIdx *= 2;
|
||||||
|
aIdx = sqliteMalloc( sizeof(int)*nIdx );
|
||||||
|
if( aIdx==0 ) goto no_mem;
|
||||||
|
sqliteDbbeCopyData(pCrsr, 0, sizeof(int)*(k+1), (char*)aIdx);
|
||||||
|
aIdx[k+1] = newVal;
|
||||||
|
aIdx[0]++;
|
||||||
|
sqliteDbbePut(pCrsr, p->aStack[tos].n, p->zStack[tos],
|
||||||
|
sizeof(int)*nIdx, (char*)aIdx);
|
||||||
|
sqliteFree(aIdx);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PopStack(p, 2);
|
PopStack(p, 2);
|
||||||
@ -2229,7 +2259,7 @@ int sqliteVdbeExec(
|
|||||||
if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
if( i>=0 && i<p->nCursor && (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
||||||
int *aIdx;
|
int *aIdx;
|
||||||
int nIdx;
|
int nIdx;
|
||||||
int j;
|
int j, k;
|
||||||
int r;
|
int r;
|
||||||
int oldVal;
|
int oldVal;
|
||||||
Integerify(p, nos);
|
Integerify(p, nos);
|
||||||
@ -2239,14 +2269,20 @@ int sqliteVdbeExec(
|
|||||||
if( r==0 ) break;
|
if( r==0 ) break;
|
||||||
nIdx = sqliteDbbeDataLength(pCrsr)/sizeof(int);
|
nIdx = sqliteDbbeDataLength(pCrsr)/sizeof(int);
|
||||||
aIdx = (int*)sqliteDbbeReadData(pCrsr, 0);
|
aIdx = (int*)sqliteDbbeReadData(pCrsr, 0);
|
||||||
for(j=0; j<nIdx && aIdx[j]!=oldVal; j++){}
|
if( (nIdx==1 && aIdx[0]==oldVal) || (aIdx[0]==1 && aIdx[1]==oldVal) ){
|
||||||
if( j>=nIdx ) break;
|
|
||||||
aIdx[j] = aIdx[nIdx-1];
|
|
||||||
if( nIdx==1 ){
|
|
||||||
sqliteDbbeDelete(pCrsr, p->aStack[tos].n, p->zStack[tos]);
|
sqliteDbbeDelete(pCrsr, p->aStack[tos].n, p->zStack[tos]);
|
||||||
}else{
|
}else{
|
||||||
|
k = aIdx[0];
|
||||||
|
for(j=1; j<=k && aIdx[j]!=oldVal; j++){}
|
||||||
|
if( j>k ) break;
|
||||||
|
aIdx[j] = aIdx[k];
|
||||||
|
aIdx[k] = 0;
|
||||||
|
aIdx[0]--;
|
||||||
|
if( aIdx[0]*3 + 1 < nIdx ){
|
||||||
|
nIdx /= 2;
|
||||||
|
}
|
||||||
sqliteDbbePut(pCrsr, p->aStack[tos].n, p->zStack[tos],
|
sqliteDbbePut(pCrsr, p->aStack[tos].n, p->zStack[tos],
|
||||||
sizeof(int)*(nIdx-1), (char*)aIdx);
|
sizeof(int)*nIdx, (char*)aIdx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PopStack(p, 2);
|
PopStack(p, 2);
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
# This file implements regression tests for SQLite library. The
|
# This file implements regression tests for SQLite library. The
|
||||||
# focus of this file is testing the CREATE INDEX statement.
|
# focus of this file is testing the CREATE INDEX statement.
|
||||||
#
|
#
|
||||||
# $Id: index.test,v 1.5 2000/06/17 13:12:40 drh Exp $
|
# $Id: index.test,v 1.6 2000/08/02 12:26:30 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@ -281,11 +281,51 @@ do_test index-10.2 {
|
|||||||
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
||||||
}
|
}
|
||||||
} {2}
|
} {2}
|
||||||
do_test index-10.2 {
|
do_test index-10.3 {
|
||||||
execsql {
|
execsql {
|
||||||
DELETE FROM t1 WHERE b=2;
|
DELETE FROM t1 WHERE b=2;
|
||||||
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
||||||
}
|
}
|
||||||
} {}
|
} {}
|
||||||
|
do_test index-10.4 {
|
||||||
|
execsql {
|
||||||
|
DELETE FROM t1;
|
||||||
|
INSERT INTO t1 VALUES (1,1);
|
||||||
|
INSERT INTO t1 VALUES (1,2);
|
||||||
|
INSERT INTO t1 VALUES (1,3);
|
||||||
|
INSERT INTO t1 VALUES (1,4);
|
||||||
|
INSERT INTO t1 VALUES (1,5);
|
||||||
|
INSERT INTO t1 VALUES (1,6);
|
||||||
|
INSERT INTO t1 VALUES (1,7);
|
||||||
|
INSERT INTO t1 VALUES (1,8);
|
||||||
|
INSERT INTO t1 VALUES (1,9);
|
||||||
|
INSERT INTO t1 VALUES (2,0);
|
||||||
|
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
||||||
|
}
|
||||||
|
} {1 2 3 4 5 6 7 8 9}
|
||||||
|
do_test index-10.5 {
|
||||||
|
execsql {
|
||||||
|
DELETE FROM t1 WHERE b IN (2, 4, 6, 8);
|
||||||
|
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
||||||
|
}
|
||||||
|
} {1 3 5 7 9}
|
||||||
|
do_test index-10.6 {
|
||||||
|
execsql {
|
||||||
|
DELETE FROM t1 WHERE b>2;
|
||||||
|
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
||||||
|
}
|
||||||
|
} {1}
|
||||||
|
do_test index-10.7 {
|
||||||
|
execsql {
|
||||||
|
DELETE FROM t1 WHERE b=1;
|
||||||
|
SELECT b FROM t1 WHERE a=1 ORDER BY b;
|
||||||
|
}
|
||||||
|
} {}
|
||||||
|
do_test index-10.8 {
|
||||||
|
execsql {
|
||||||
|
SELECT b FROM t1 ORDER BY b;
|
||||||
|
}
|
||||||
|
} {0}
|
||||||
|
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
@ -17,6 +17,13 @@ proc chng {date desc} {
|
|||||||
puts "<DD><P><UL>$desc</UL></P></DD>"
|
puts "<DD><P><UL>$desc</UL></P></DD>"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chng {2000 Aug 2} {
|
||||||
|
<li>The file format for indices was changed slightly in order to work
|
||||||
|
around an inefficiency that can sometimes come up with GDBM when
|
||||||
|
there are large indices having many entries with the same key.
|
||||||
|
<font color="red">** Incompatible Change **</font></li>
|
||||||
|
}
|
||||||
|
|
||||||
chng {2000 Aug 1} {
|
chng {2000 Aug 1} {
|
||||||
<li>The parser's stack was overflowing on a very long UPDATE statement.
|
<li>The parser's stack was overflowing on a very long UPDATE statement.
|
||||||
This is now fixed.</li>
|
This is now fixed.</li>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Run this Tcl script to generate the fileformat.html file.
|
# Run this Tcl script to generate the fileformat.html file.
|
||||||
#
|
#
|
||||||
set rcsid {$Id: fileformat.tcl,v 1.2 2000/06/23 17:02:09 drh Exp $}
|
set rcsid {$Id: fileformat.tcl,v 1.3 2000/08/02 12:26:30 drh Exp $}
|
||||||
|
|
||||||
puts {<html>
|
puts {<html>
|
||||||
<head>
|
<head>
|
||||||
@ -109,11 +109,11 @@ sqlite> (((insert into t1 values(10,NULL,'hello!');)))
|
|||||||
sqlite> (((insert into t1 values(-11,'this is','a test');)))
|
sqlite> (((insert into t1 values(-11,'this is','a test');)))
|
||||||
sqlite> (((.exit)))
|
sqlite> (((.exit)))
|
||||||
$ (((gdbmdump ex1/t1.tbl)))
|
$ (((gdbmdump ex1/t1.tbl)))
|
||||||
key : 223100ae "1..
|
key : 6d1a6e03 m.n.
|
||||||
data : 0c000000 10000000 18000000 2d313100 74686973 ............-11.this
|
data : 0c000000 10000000 18000000 2d313100 74686973 ............-11.this
|
||||||
20697300 61207465 737400 is.a test.
|
20697300 61207465 737400 is.a test.
|
||||||
|
|
||||||
key : a840e996 .@..
|
key : 6d3f90e2 m?..
|
||||||
data : 0c000000 00000000 0f000000 31300068 656c6c6f ............10.hello
|
data : 0c000000 00000000 0f000000 31300068 656c6c6f ............10.hello
|
||||||
2100 !.
|
2100 !.
|
||||||
|
|
||||||
@ -151,7 +151,12 @@ table that is being indexed. The GDBM key is an
|
|||||||
arbitrary length null-terminated string which is SQL key that
|
arbitrary length null-terminated string which is SQL key that
|
||||||
is used by the index. The data is a list of integers that correspond
|
is used by the index. The data is a list of integers that correspond
|
||||||
to GDBM keys of entries in data table that have the corresponding
|
to GDBM keys of entries in data table that have the corresponding
|
||||||
SQL key.</p>
|
SQL key. If the data record of the index is exactly 4 bytes in size,
|
||||||
|
then the data represents a single integer key. If the data is greater
|
||||||
|
than 4 bytes in size, then the first 4 bytes form an integer that
|
||||||
|
tells us how many keys are in the data. The index data record is
|
||||||
|
always sized to be a power of 2. Unused slots at the end of the
|
||||||
|
index data record are filled with zero.</p>
|
||||||
|
|
||||||
<p>To illustrate, we will create an index on the example table
|
<p>To illustrate, we will create an index on the example table
|
||||||
shown above, and add a new entry to this table that has a duplicate
|
shown above, and add a new entry to this table that has a duplicate
|
||||||
@ -191,10 +196,10 @@ GDBM key.</p>
|
|||||||
Code {
|
Code {
|
||||||
$ (((gdbmdump ex1/i1.tbl)))
|
$ (((gdbmdump ex1/i1.tbl)))
|
||||||
key : 313000 10.
|
key : 313000 10.
|
||||||
data : a840e996 c19e3119 .@....1.
|
data : 02000000 45b4f724 6d3f90e2 00000000 ....E..$m?......
|
||||||
|
|
||||||
key : 2d313100 -11.
|
key : 2d313100 -11.
|
||||||
data : 223100ae "1..
|
data : 6d1a6e03 m.n.
|
||||||
|
|
||||||
$
|
$
|
||||||
}
|
}
|
||||||
@ -207,6 +212,11 @@ are just the text values for <b>a</b> columns of table <b>t1</b>.
|
|||||||
The data for each record of the index is a list of integers
|
The data for each record of the index is a list of integers
|
||||||
where each integer is the GDBM key for an entry in the <b>t1</b>
|
where each integer is the GDBM key for an entry in the <b>t1</b>
|
||||||
table that has the corresponding value for the <b>a</b> column.</p>
|
table that has the corresponding value for the <b>a</b> column.</p>
|
||||||
|
The index entry for -11 contains only a single entry and is 4
|
||||||
|
bytes in size. The index entry for 10 is 16 bytes in size but
|
||||||
|
contains only 2 entries. The first integer is the number of
|
||||||
|
entires. The two integer keys follow. The last 4 bytes unused
|
||||||
|
and are set to zero.
|
||||||
}
|
}
|
||||||
|
|
||||||
puts {
|
puts {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Run this TCL script to generate HTML for the index.html file.
|
# Run this TCL script to generate HTML for the index.html file.
|
||||||
#
|
#
|
||||||
set rcsid {$Id: index.tcl,v 1.22 2000/08/01 09:56:27 drh Exp $}
|
set rcsid {$Id: index.tcl,v 1.23 2000/08/02 12:26:30 drh Exp $}
|
||||||
|
|
||||||
puts {<html>
|
puts {<html>
|
||||||
<head><title>SQLite: An SQL Database Engine Built Atop GDBM</title></head>
|
<head><title>SQLite: An SQL Database Engine Built Atop GDBM</title></head>
|
||||||
@ -13,23 +13,6 @@ puts "This page was last modified on [lrange $rcsid 3 4] GMT<br>"
|
|||||||
puts "The SQLite source code was last modifed on [exec cat last_change] GMT"
|
puts "The SQLite source code was last modifed on [exec cat last_change] GMT"
|
||||||
puts {</p>}
|
puts {</p>}
|
||||||
|
|
||||||
if 0 {
|
|
||||||
puts {
|
|
||||||
<h2>News</h2>
|
|
||||||
<p>
|
|
||||||
The SQLite code base is being called "beta" only because it is
|
|
||||||
relatively new. It appears to be stable and usable.
|
|
||||||
Most of the SQL language is now implemented and working.
|
|
||||||
The regression test suite
|
|
||||||
provides good coverage, according to
|
|
||||||
<a href="http://gcc.gnu.org/onlinedocs/gcov_1.html">gcov</a>.
|
|
||||||
There are currently no known errors in the code.</p>
|
|
||||||
|
|
||||||
<p>If you find bugs or missing features, please submit a comment
|
|
||||||
to the <a href="#mailinglist">SQLite mailing list</a>.</p>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
puts {<h2>Introduction</h2>
|
puts {<h2>Introduction</h2>
|
||||||
|
|
||||||
<p>SQLite is an SQL database engine built on top of the
|
<p>SQLite is an SQL database engine built on top of the
|
||||||
@ -41,6 +24,25 @@ that can be linked
|
|||||||
with a C/C++ program to provide SQL database access without
|
with a C/C++ program to provide SQL database access without
|
||||||
an separate RDBMS.</p>
|
an separate RDBMS.</p>
|
||||||
|
|
||||||
|
<h2>Important News Flash!</h2>
|
||||||
|
<p>
|
||||||
|
The SQLite file format was changed in an incompatible way on
|
||||||
|
Aug 2, 2000. If you are updated the library and have databases
|
||||||
|
built using the old version of the library, you should save your
|
||||||
|
old databases into an ASCII fileformat then reimport those
|
||||||
|
database using the new library. For example, if you change the
|
||||||
|
name of the old <b>sqlite</b> utility to "old-sqlite" and
|
||||||
|
change the name of the old database directory to "old-db", then
|
||||||
|
you can reconstruct the database as follows:</p>
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
echo .dump | old-sqlite old-db | sqlite db
|
||||||
|
</pre></blockquote>
|
||||||
|
|
||||||
|
<p>This file format change was made to work around a potential
|
||||||
|
inefficiency in GDBM that comes up when large indices are created
|
||||||
|
on tables where many entries in the table have the same key.</p>
|
||||||
|
|
||||||
<h2>Features</h2>
|
<h2>Features</h2>
|
||||||
|
|
||||||
<p><ul>
|
<p><ul>
|
||||||
|
Reference in New Issue
Block a user