-C Minor\schange\sto\smain.c\sso\sthat\sit\swill\scompile\swith\sGCC\s2.96.\s(CVS\s1325)
-D 2004-05-08T10:11:37
+C Get\sthe\scode\sback\sto\sthe\spoint\swhere\sit\swill\scompile\sthe\sbtree.c\stests.\nMove\sthe\sdefault\skey\scomparison\sroutine\sfrom\sbtree.c\sinto\svdbeaux.c.\nCommented\sout\scode\sin\svdbe.c\sthat\swill\sneed\sto\sbe\sfixed.\s(CVS\s1326)
+D 2004-05-08T10:56:11
F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2
F src/attach.c fa9a58234406d84eeb900517d0c0adc4b2da051a
F src/auth.c a2a46e3ed7799134cf3d2dd5ae6650115f26b653
-F src/btree.c 8c50e8f3d1dce11a43342068b3bfc88bcfb104f8
+F src/btree.c 27600f910e247c905389ecf3f246f27e9649cbea
F src/btree.h 07a16dbb8c29291d0768b956649350d8f8c3dac3
F src/btree_rb.c 47e5b5ec90846af392b5668b34648198ba459561
F src/build.c 21b6645c966970dac51bcccfa8650403a3f56210
F src/utf.c fc799748d43fe1982d157b871e3e420a19c85d4f
F src/util.c 0c31a53b848648271d0910c2604b4d8ae516ebb1
F src/vacuum.c 91ba5a23eca2d9a8a11191cef577d417f9318976
-F src/vdbe.c 500d5140b6f779bfcc60bef74b914e4dc6686439
-F src/vdbe.h 3cf970b0a64be04d36f4dcece3cecd28312d745c
+F src/vdbe.c 9b089e0b20e7ee4dea416eb86520dffa0c04f02a
+F src/vdbe.h 2dc4d1161b64f5684faa6a2d292e318a185ecb2e
F src/vdbeInt.h 4563dc1c9f05a842cbbc7759e4cc7f3779f53547
-F src/vdbeaux.c 68c24aa7b7facf7412755f3807d8a3acf4e29963
+F src/vdbeaux.c 81d95af2651777f7960c2cca18613aa3aa95403e
F src/where.c 6db0291280f2c642bae2c69a70750325b53717a4
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
F test/attach.test ba8261d38da6b6a7d4f78ec543c548c4418582ef
F test/bigfile.test ea904b853ce2d703b16c5ce90e2b54951bc1ae81
F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
F test/bind.test 56a57043b42c4664ca705f6050e56717a8a6699a
-F test/btree.test 54caf3f97934711dac9a47ac4119b033dd4caffa
+F test/btree.test d9d00f8ac8bfa4945861f92c5b14fbe884d874c4
F test/btree2.test e3b81ec33dc2f89b3e6087436dfe605b870c9080
F test/btree3.test e597fb59be2ac0ea69c62aaa2064e998e528b665
F test/btree3rb.test 127efcf5cdfcc352054e7db12622b01cdd8b36ac
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
-P 8af6474c49263ae26216dff9465b33f76b500cf4
-R 2ed9c287297cae4581a05c12a5103a70
+P 1a09a1ada199b76926c64bd79ad39d6d50a75011
+R 020d676c42c3c99a03395fc2bd1d45bd
U drh
-Z 345f2d0e7e37c3a350d2d2026464612e
+Z e3b04ec339a83a6885a62a5e117d1378
-1a09a1ada199b76926c64bd79ad39d6d50a75011
\ No newline at end of file
+2bca92240b16a51f78661c3ba4d779d231780f8d
\ No newline at end of file
** May you share freely, never taking more than you give.
**
*************************************************************************
-** $Id: btree.c,v 1.114 2004/05/08 08:23:21 danielk1977 Exp $
+** $Id: btree.c,v 1.115 2004/05/08 10:56:11 drh Exp $
**
** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to
assert( tsize+data[pPage->hdrOffset+5]==pPage->nFree );
}
-#if 0
-/*
-** The following is the default comparison function for (non-integer)
-** keys in the btrees. This function returns negative, zero, or
-** positive if the first key is less than, equal to, or greater than
-** the second.
-**
-** The key consists of multiple fields. Each field begins with a variable
-** length integer which determines the field type and the number of bytes
-** of key data to follow for that field.
-**
-** initial varint bytes to follow type
-** -------------- --------------- ---------------
-** 0 0 NULL
-** 1 1 signed integer
-** 2 2 signed integer
-** 3 4 signed integer
-** 4 8 signed integer
-** 5 8 IEEE float
-** 6..12 reserved for expansion
-** N>=12 and even (N-12)/2 BLOB
-** N>=13 and odd (N-13)/2 text
-**
-** For a particular database, text is always either UTF-8, UTF-16BE, or
-** UTF-16LE. Which of these three formats to use is determined by one
-** of the meta values in the file header.
-**
-*/
-static int keyComp(
- void *userData,
- int nKey1, const unsigned char *aKey1,
- int nKey2, const unsigned char *aKey2,
-){
- KeyClass *pKeyClass = (KeyClass*)userData;
- i1 = i2 = 0;
- for(i1=i2=0; pKeyClass!=0; pKeyClass=pKeyClass->pNext){
- if( varint32(aKey1, &i1, nKey1, &n1) ) goto bad_key;
- if( varint32(aKey2, &i2, nKey2, &n2) ) goto bad_key;
- if( n1==0 ){
- if( n2>0 ) return -1;
- /* both values are NULL. consider them equal for sorting purposes. */
- }else if( n2==0 ){
- /* right value is NULL but the left value is not. right comes first */
- return +1;
- }else if( n1<=5 ){
- if( n2>5 ) return -1;
- /* both values are numbers. sort them numerically */
- ...
- }else if( n2<=5 ){
- /* right value is numeric and left is TEXT or BLOB. right comes first */
- return +1;
- }else if( n1<12 || n2<12 ){
- /* bad coding for either the left or the right value */
- goto bad_key;
- }else if( (n1&0x01)==0 ){
- if( n2&0x01)!=0 ) return -1;
- /* both values are BLOB. use memcmp() */
- n1 = (n1-12)/2;
- n2 = (n2-12)/2;
- if( i1+n1>nKey1 || i2+n2>nKey2 ) goto bad_key;
- c = memcmp(&aKey1[i1], &aKey2[i2], n1<n2 ? n1 : n2);
- if( c!=0 ){
- return c | 1;
- }
- if( n1!=n2 ){
- return (n1-n2) | 1;
- }
- i1 += n1;
- i2 += n2;
- }else if( n2&0x01)!=0 ){
- /* right value if BLOB and left is TEXT. BLOB comes first */
- return +1;
- }else{
- /* both values are TEXT. use the supplied comparison function */
- n1 = (n1-13)/2;
- n2 = (n2-13)/2;
- if( i1+n1>nKey1 || i2+n2>nKey2 ) goto bad_key;
- c = pKeyClass->xCompare(pKeyClass->pUser, n1, &aKey1[i1], n2, &aKey2[i2]);
- if( c!=0 ){
- return c | 1;
- }
- i1 += n1;
- i2 += n2;
- }
- }
- return 0;
-
-bad_key:
- return 1;
-}
-#endif
-
/*
** Resize the aCell[] array of the given page so that it is able to
** hold at least nNewSz entries.
int i, j;
int nFree;
u16 idx;
- int hdrOffset;
+ int hdr;
+ unsigned char *data;
char range[20];
unsigned char payload[20];
+
rc = getPage(pBt, (Pgno)pgno, &pPage);
if( rc ){
return rc;
}
+ hdr = pPage->hdrOffset;
+ data = pPage->aData;
printf("PAGE %d: flags=0x%02x frag=%d\n", pgno,
- pPage->aData[pPage->hdrOffset], pPage->aData[pPage->hdrOffset+5]);
+ data[hdr], data[hdr+5]);
i = 0;
- assert( pPage->hdrOffset == (pgno==1 ? 100 : 0) );
- idx = get2byte(&pPage->aData[hdrOffset+3]);
+ assert( hdr == (pgno==1 ? 100 : 0) );
+ idx = get2byte(&data[hdr+3]);
while( idx>0 && idx<=pBt->pageSize ){
u64 nData, nKey;
int nHeader;
Pgno child;
- unsigned char *pCell = &pPage->aData[idx];
+ unsigned char *pCell = &data[idx];
int sz = cellSize(pPage, pCell);
sprintf(range,"%d..%d", idx, idx+sz-1);
parseCellHeader(pPage, pCell, &nData, &nKey, &nHeader);
printf("ERROR: next cell index out of range: %d\n", idx);
}
if( !pPage->leaf ){
- printf("right_child: %d\n", get4byte(&pPage->aData[6]));
+ printf("right_child: %d\n", get4byte(&data[6]));
}
nFree = 0;
i = 0;
- idx = get2byte(&pPage->aData[hdrOffset+1]);
+ idx = get2byte(&data[hdr+1]);
while( idx>0 && idx<pPage->pBt->pageSize ){
- int sz = get2byte(&pPage->aData[idx+2]);
+ int sz = get2byte(&data[idx+2]);
sprintf(range,"%d..%d", idx, idx+sz-1);
nFree += sz;
printf("freeblock %2d: i=%-10s size=%-4d total=%d\n",
i, range, sz, nFree);
- idx = get2byte(&pPage->aData[idx]);
+ idx = get2byte(&data[idx]);
i++;
}
if( idx!=0 ){
printf("ERROR: next freeblock index out of range: %d\n", idx);
}
if( recursive && !pPage->leaf ){
- idx = get2byte(&pPage->aData[hdrOffset+3]);
+ idx = get2byte(&data[hdr+3]);
while( idx>0 && idx<pBt->pageSize ){
- unsigned char *pCell = &pPage->aData[idx];
+ unsigned char *pCell = &data[idx];
sqlite3BtreePageDump(pBt, get4byte(&pCell[2]), 1);
idx = get2byte(pCell);
}
- sqlite3BtreePageDump(pBt, get4byte(&pPage->aData[hdrOffset+6]), 1);
+ sqlite3BtreePageDump(pBt, get4byte(&data[hdr+6]), 1);
}
- sqlite3pager_unref(pPage->aData);
+ sqlite3pager_unref(data);
return SQLITE_OK;
}
#endif
}
return rc;
}
-
-int sqlite3BtreeKeyCompare(
- BtCursor *pCur, /* Pointer to entry to compare against */
- const void *pKey, /* Key to compare against entry that pCur points to */
- int nKey, /* Number of bytes in pKey */
- int nIgnore, /* Ignore this many bytes at the end of pCur */
- int *pResult /* Write the result here */
-){
- void *pCellKey;
- u64 nCellKey;
- int rc;
-
- sqlite3BtreeKeySize(pCur, &nCellKey);
- nCellKey = nCellKey - nIgnore;
- if( nCellKey<=0 ){
- *pResult = 0;
- return SQLITE_OK;
- }
-
- pCellKey = sqlite3BtreeKeyFetch(pCur);
- if( pCellKey ){
- *pResult = pCur->xCompare(pCur->pArg, nCellKey, pCellKey, nKey, pKey);
- return SQLITE_OK;
- }
-
- pCellKey = sqliteMalloc( nCellKey );
- if( pCellKey==0 ) return SQLITE_NOMEM;
-
- rc = sqlite3BtreeKey(pCur, 0, nCellKey, pCellKey);
- *pResult = pCur->xCompare(pCur->pArg, nCellKey, pCellKey, nKey, pKey);
- sqliteFree(pCellKey);
-
- return rc;
-}
-
-
-
** in this file for details. If in doubt, do not deviate from existing
** commenting and indentation practices when changing or adding code.
**
-** $Id: vdbe.c,v 1.269 2004/05/08 08:23:40 danielk1977 Exp $
+** $Id: vdbe.c,v 1.270 2004/05/08 10:56:12 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
break;
}
}
+/******** FIX ME
rc = sqlite3BtreeKeyCompare(pCrsr, zKey, nKey-4, 4, &res);
+*/rc=SQLITE_INTERNAL;
if( rc!=SQLITE_OK ) goto abort_due_to_error;
if( res>0 ){
pc = pOp->p2 - 1;
int c;
/* TODO: sqlite3BtreeKeySize(pCrsr, &n); */
if( n==nKey
+/***** FIX ME
&& sqlite3BtreeKeyCompare(pCrsr, zKey, nKey-4, 4, &c)==SQLITE_OK
+*/
&& c==0
){
rc = SQLITE_CONSTRAINT;
Stringify(pTos);
assert( p->aCsr[i].deferredMoveto==0 );
+/****** FIX ME
rc = sqlite3BtreeKeyCompare(pCrsr, pTos->z, pTos->n, 4, &res);
+*/rc=SQLITE_INTERNAL;
if( rc!=SQLITE_OK ){
break;
}
sqlite3SetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
goto vdbe_halt;
}
-
-
-
** or VDBE. The VDBE implements an abstract machine that runs a
** simple program to access and modify the underlying database.
**
-** $Id: vdbe.h,v 1.72 2004/05/08 08:23:45 danielk1977 Exp $
+** $Id: vdbe.h,v 1.73 2004/05/08 10:56:17 drh Exp $
*/
#ifndef _SQLITE_VDBE_H_
#define _SQLITE_VDBE_H_
void sqlite3VdbeCompressSpace(Vdbe*,int);
int sqlite3VdbeReset(Vdbe*,char **);
int sqliteVdbeSetVariables(Vdbe*,int,const char**);
+int sqlite3VdbeKeyCompare(void*,int,const u8*,int, const u8*);
#endif
-
-
-
}
+/*
+** The following is the comparison function for (non-integer)
+** keys in the btrees. This function returns negative, zero, or
+** positive if the first key is less than, equal to, or greater than
+** the second.
+**
+** The key consists of multiple fields. Each field begins with a variable
+** length integer which determines the field type and the number of bytes
+** of key data to follow for that field.
+**
+** initial varint bytes to follow type
+** -------------- --------------- ---------------
+** 0 0 NULL
+** 1 1 signed integer
+** 2 2 signed integer
+** 3 4 signed integer
+** 4 8 signed integer
+** 5 8 IEEE float
+** 6..12 reserved for expansion
+** N>=12 and even (N-12)/2 BLOB
+** N>=13 and odd (N-13)/2 text
+**
+** For a particular database, text is always either UTF-8, UTF-16BE, or
+** UTF-16LE. Which of these three formats to use is determined by one
+** of the meta values in the file header.
+**
+*/
+#if 0
+int sqlite3VdbeKeyCompare(
+ void *userData,
+ int nKey1, const unsigned char *aKey1,
+ int nKey2, const unsigned char *aKey2,
+){
+ KeyClass *pKeyClass = (KeyClass*)userData;
+ i1 = i2 = 0;
+ for(i1=i2=0; pKeyClass!=0; pKeyClass=pKeyClass->pNext){
+ if( varint32(aKey1, &i1, nKey1, &n1) ) goto bad_key;
+ if( varint32(aKey2, &i2, nKey2, &n2) ) goto bad_key;
+ if( n1==0 ){
+ if( n2>0 ) return -1;
+ /* both values are NULL. consider them equal for sorting purposes. */
+ }else if( n2==0 ){
+ /* right value is NULL but the left value is not. right comes first */
+ return +1;
+ }else if( n1<=5 ){
+ if( n2>5 ) return -1;
+ /* both values are numbers. sort them numerically */
+ /******* Finish this ********/
+ }else if( n2<=5 ){
+ /* right value is numeric and left is TEXT or BLOB. right comes first */
+ return +1;
+ }else if( n1<12 || n2<12 ){
+ /* bad coding for either the left or the right value */
+ goto bad_key;
+ }else if( (n1&0x01)==0 ){
+ if( n2&0x01)!=0 ) return -1;
+ /* both values are BLOB. use memcmp() */
+ n1 = (n1-12)/2;
+ n2 = (n2-12)/2;
+ if( i1+n1>nKey1 || i2+n2>nKey2 ) goto bad_key;
+ c = memcmp(&aKey1[i1], &aKey2[i2], n1<n2 ? n1 : n2);
+ if( c!=0 ){
+ return c | 1;
+ }
+ if( n1!=n2 ){
+ return (n1-n2) | 1;
+ }
+ i1 += n1;
+ i2 += n2;
+ }else if( n2&0x01)!=0 ){
+ /* right value if BLOB and left is TEXT. BLOB comes first */
+ return +1;
+ }else{
+ /* both values are TEXT. use the supplied comparison function */
+ n1 = (n1-13)/2;
+ n2 = (n2-13)/2;
+ if( i1+n1>nKey1 || i2+n2>nKey2 ) goto bad_key;
+ c = pKeyClass->xCompare(pKeyClass->pUser, n1, &aKey1[i1], n2, &aKey2[i2]);
+ if( c!=0 ){
+ return c | 1;
+ }
+ i1 += n1;
+ i2 += n2;
+ }
+ }
+ return 0;
+bad_key:
+ return 1;
+}
+#endif
# This file implements regression tests for SQLite library. The
# focus of this script is btree database backend
#
-# $Id: btree.test,v 1.18 2004/05/08 02:03:23 drh Exp $
+# $Id: btree.test,v 1.19 2004/05/08 10:56:20 drh Exp $
set testdir [file dirname $argv0]
select_keys $::c1
} {001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020}
#btree_page_dump $::b1 7
-#btree_page_dump $::b1 2
+btree_page_dump $::b1 1
#btree_page_dump $::b1 6
do_test btree-10.4 {
btree_move_to $::c1 011