mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Adding table column query capability to support ODBC. (CVS 278)
FossilOrigin-Name: b63b3f3684a3d584ef99f54cde76b6c483bbfef7
This commit is contained in:
@ -20,6 +20,7 @@ TOP = ../sqlite
|
|||||||
# will run on the platform that is doing the build.
|
# will run on the platform that is doing the build.
|
||||||
#
|
#
|
||||||
BCC = gcc -g -O2
|
BCC = gcc -g -O2
|
||||||
|
#BCC = /opt/ancic/bin/c89 -0
|
||||||
|
|
||||||
#### If the target operating system supports the "usleep()" system
|
#### If the target operating system supports the "usleep()" system
|
||||||
# call, then define the HAVE_USLEEP macro for all C modules.
|
# call, then define the HAVE_USLEEP macro for all C modules.
|
||||||
@ -58,6 +59,7 @@ EXE =
|
|||||||
TCC = gcc -O6
|
TCC = gcc -O6
|
||||||
#TCC = gcc -g -O0 -Wall
|
#TCC = gcc -g -O0 -Wall
|
||||||
#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6
|
#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6
|
||||||
|
#TCC = /opt/ansic/bin/c89 -O +z -Wl,-a,archive
|
||||||
|
|
||||||
#### Tools used to build a static library.
|
#### Tools used to build a static library.
|
||||||
#
|
#
|
||||||
@ -72,12 +74,14 @@ RANLIB = ranlib
|
|||||||
#TCL_FLAGS = -DSTATIC_BUILD=1
|
#TCL_FLAGS = -DSTATIC_BUILD=1
|
||||||
TCL_FLAGS = -I/home/drh/tcltk/8.4linux
|
TCL_FLAGS = -I/home/drh/tcltk/8.4linux
|
||||||
#TCL_FLAGS = -I/home/drh/tcltk/8.4win -DSTATIC_BUILD=1
|
#TCL_FLAGS = -I/home/drh/tcltk/8.4win -DSTATIC_BUILD=1
|
||||||
|
#TCL_FLAGS = -I/home/drh/tcltk/8.3hpux
|
||||||
|
|
||||||
#### Linker options needed to link against the TCL library.
|
#### Linker options needed to link against the TCL library.
|
||||||
#
|
#
|
||||||
#LIBTCL = -ltcl -lm -ldl
|
#LIBTCL = -ltcl -lm -ldl
|
||||||
LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
|
LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm -ldl
|
||||||
#LIBTCL = /home/drh/tcltk/8.4win/libtcl84s.a -lmsvcrt
|
#LIBTCL = /home/drh/tcltk/8.4win/libtcl84s.a -lmsvcrt
|
||||||
|
#LIBTCL = /home/drh/tcltk/8.3hpux/libtcl8.3.a -ldld -lm -lc
|
||||||
|
|
||||||
#### Compiler options needed for programs that use the readline() library.
|
#### Compiler options needed for programs that use the readline() library.
|
||||||
#
|
#
|
||||||
|
45
manifest
45
manifest
@ -1,7 +1,7 @@
|
|||||||
C Version\s2.0.1\s(CVS\s469)
|
C Adding\stable\scolumn\squery\scapability\sto\ssupport\sODBC.\s(CVS\s278)
|
||||||
D 2001-10-02T13:05:00
|
D 2001-10-06T16:33:02
|
||||||
F Makefile.in 98d4627cb364537e4c3a29ee806171f3abf5211a
|
F Makefile.in 98d4627cb364537e4c3a29ee806171f3abf5211a
|
||||||
F Makefile.template 7179523fdf3d6e7933ec843e2352dcfc9785c700
|
F Makefile.template 1e54087c0390c4ce0bb5be43e14ba028283751e6
|
||||||
F README 93d2977cc5c6595c448de16bdefc312b9d401533
|
F README 93d2977cc5c6595c448de16bdefc312b9d401533
|
||||||
F VERSION 1fb7be12efaa1608dc63e784e33082ae0ac7919b
|
F VERSION 1fb7be12efaa1608dc63e784e33082ae0ac7919b
|
||||||
F aclocal.m4 11faa843caa38fd451bc6aeb43e248d1723a269d
|
F aclocal.m4 11faa843caa38fd451bc6aeb43e248d1723a269d
|
||||||
@ -19,37 +19,37 @@ F libtool c56e618713c9510a103bda6b95f3ea3900dcacd6
|
|||||||
F ltmain.sh e9ed72eb1d690f447c13945eaf69e28af531eda1
|
F ltmain.sh e9ed72eb1d690f447c13945eaf69e28af531eda1
|
||||||
F publish.sh 502b907fa9e0214309406fa5f520b3d3c14f9c1d
|
F publish.sh 502b907fa9e0214309406fa5f520b3d3c14f9c1d
|
||||||
F src/TODO af7f3cab0228e34149cf98e073aa83d45878e7e6
|
F src/TODO af7f3cab0228e34149cf98e073aa83d45878e7e6
|
||||||
F src/btree.c a001f151a7dd32b7afb328fd6f8e445c57d8a74c
|
F src/btree.c 7e9c33a714ed1630562f89ad19847f5f28bd6d4d
|
||||||
F src/btree.h 57d653ef5137b91f2a068aaf71a2905468dd2cb7
|
F src/btree.h 57d653ef5137b91f2a068aaf71a2905468dd2cb7
|
||||||
F src/build.c 64a7325c1471087ada81588d6ace6d294b28cd1d
|
F src/build.c 7cbac6c3a5d35e56f8d57bb6b07fba5e8a41c806
|
||||||
F src/delete.c 81002d889aae874decf507627207c5d1b3599dc2
|
F src/delete.c 81002d889aae874decf507627207c5d1b3599dc2
|
||||||
F src/expr.c 343a515a4abaf60e9e26c7412aa8c43fd3eae97d
|
F src/expr.c 2f68829d983ec3f92eeb8b89ce4b9e5704169a80
|
||||||
F src/hash.c bf36fb4cba114015123b0050f137d2c4553778a1
|
F src/hash.c bf36fb4cba114015123b0050f137d2c4553778a1
|
||||||
F src/hash.h 5f6e7c04c46ed015ab4e01797c2049b4af5b006d
|
F src/hash.h 5f6e7c04c46ed015ab4e01797c2049b4af5b006d
|
||||||
F src/insert.c 0552c2a4b5fd359e9ed5d1e314d5e89093802c8e
|
F src/insert.c 01dd6ddee901a8a55c9b05a62b30023ec43de9ce
|
||||||
F src/main.c 87cabd64c99af66ba95f06a7dcd870eec65d89af
|
F src/main.c 6db4ba7ed8f1c1866b04eab6d0f9b46455e152c8
|
||||||
F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c
|
F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c
|
||||||
F src/os.c 45376582c41dc8829330816d56b8e9e6cd1b7972
|
F src/os.c 45376582c41dc8829330816d56b8e9e6cd1b7972
|
||||||
F src/os.h 0f478e2fef5ec1612f94b59b163d4807d4c77d6d
|
F src/os.h 0f478e2fef5ec1612f94b59b163d4807d4c77d6d
|
||||||
F src/pager.c 0fe02b63a89d8eebb42ad30529d0c7cc918ecb94
|
F src/pager.c 592c16b06ad07c715240e382028e29b0e83378be
|
||||||
F src/pager.h a0d4c5ae271914aa07b62aee0707997d6932b6ca
|
F src/pager.h a0d4c5ae271914aa07b62aee0707997d6932b6ca
|
||||||
F src/parse.y 5ead6fe1e7c5f13220030f41ce68af155b54c6ab
|
F src/parse.y fcd3452640cf5ae2304ce430668112e0da07745a
|
||||||
F src/printf.c b1e22a47be8cdf707815647239991e08e8cb69f9
|
F src/printf.c b1e22a47be8cdf707815647239991e08e8cb69f9
|
||||||
F src/random.c 708a23f69f40d6f2ae5ce1a04e6a4055d4a6ecec
|
F src/random.c 708a23f69f40d6f2ae5ce1a04e6a4055d4a6ecec
|
||||||
F src/select.c 7d90a6464906419fde96c0707a4cf4f3280db318
|
F src/select.c 0ef8ca1b7de2467fe082bcb35a5ab3b5be56153c
|
||||||
F src/shell.c cd2ae9f22dec5e4e5411e6253abfc3e240b4e030
|
F src/shell.c cb8c41f1b2173efd212dab3f35f1fc6bf32ead76
|
||||||
F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
|
F src/shell.tcl 27ecbd63dd88396ad16d81ab44f73e6c0ea9d20e
|
||||||
F src/sqlite.h.in 08151912b382ded315b5c8fc6288d9d7a9332aa4
|
F src/sqlite.h.in b95c161abf1d58bceb05290fa3f657d8f388fc11
|
||||||
F src/sqliteInt.h 3ead85324704b79b2ae6799d6af3e5fd710756d9
|
F src/sqliteInt.h 78b1890c4b61d35f33941cf9a2aae366b32b3dd3
|
||||||
F src/table.c abd0adbe0fee39d995287b3bcccd908d174dfcac
|
F src/table.c abd0adbe0fee39d995287b3bcccd908d174dfcac
|
||||||
F src/tclsqlite.c 765599686c19ed777ac379928d732c8bfc63ebac
|
F src/tclsqlite.c 765599686c19ed777ac379928d732c8bfc63ebac
|
||||||
F src/test1.c e4b31f62ea71963cbae44338acf477a04fc8fc49
|
F src/test1.c e4b31f62ea71963cbae44338acf477a04fc8fc49
|
||||||
F src/test2.c 0168b39225b768cfdadd534406f9dec58c27879e
|
F src/test2.c 0168b39225b768cfdadd534406f9dec58c27879e
|
||||||
F src/test3.c 4a0d7b882fdae731dbb759f512ad867122452f96
|
F src/test3.c 4a0d7b882fdae731dbb759f512ad867122452f96
|
||||||
F src/tokenize.c 2ab07b85fde38d8fa2b4e73417b93e94f9cf8f5f
|
F src/tokenize.c 8a2aa0443f8bb1a02d021604377e2783e8e45f42
|
||||||
F src/update.c 0449af173b5f2f0b26e2f0e4545ee0e0429763cb
|
F src/update.c 0449af173b5f2f0b26e2f0e4545ee0e0429763cb
|
||||||
F src/util.c 4da3be37d0fd3c640d2d3033503768afdc8e5387
|
F src/util.c 4da3be37d0fd3c640d2d3033503768afdc8e5387
|
||||||
F src/vdbe.c 173892798e1698605fafb24d29e26e3a5644ddf5
|
F src/vdbe.c 5c865988f8b33dcb8c5282f24bde404ab5d96899
|
||||||
F src/vdbe.h c543a58f52fb654c90dd31d0d0c31309f4d838de
|
F src/vdbe.h c543a58f52fb654c90dd31d0d0c31309f4d838de
|
||||||
F src/where.c cce952b6a2459ac2296e3432876a4252d2fe3b87
|
F src/where.c cce952b6a2459ac2296e3432876a4252d2fe3b87
|
||||||
F test/all.test a2320eb40b462f25bd3e33115b1cabf3791450dd
|
F test/all.test a2320eb40b462f25bd3e33115b1cabf3791450dd
|
||||||
@ -73,7 +73,7 @@ F test/printf.test 3cb415073754cb8ff076f26173143c3cd293a9da
|
|||||||
F test/quick.test b6ec50f808efc06595fd324bf4f3fabadb9c7e9c
|
F test/quick.test b6ec50f808efc06595fd324bf4f3fabadb9c7e9c
|
||||||
F test/quote.test 286db944717afa9a9bf829dd85e59185c65d5435
|
F test/quote.test 286db944717afa9a9bf829dd85e59185c65d5435
|
||||||
F test/rowid.test 427bfbbe9684fe7a2f851aa05badaae6d4972ce8
|
F test/rowid.test 427bfbbe9684fe7a2f851aa05badaae6d4972ce8
|
||||||
F test/select1.test e0c3ff05f44233cde7918cb22ba4be05ea7a08ec
|
F test/select1.test b59e8c713277d7545f5b6e782e6223e51fea45a5
|
||||||
F test/select2.test f91c903e2bab0e9d45274855a981eebf846d5e32
|
F test/select2.test f91c903e2bab0e9d45274855a981eebf846d5e32
|
||||||
F test/select3.test 5e1fe8e5a4e63fb2827ab3b89527e0fd4ae35259
|
F test/select3.test 5e1fe8e5a4e63fb2827ab3b89527e0fd4ae35259
|
||||||
F test/select4.test 29a2ffb187f3d8b6ca42a0a6b619e9cabe12e228
|
F test/select4.test 29a2ffb187f3d8b6ca42a0a6b619e9cabe12e228
|
||||||
@ -100,10 +100,11 @@ F www/arch.fig d5f9752a4dbf242e9cfffffd3f5762b6c63b3bcf
|
|||||||
F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4
|
F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4
|
||||||
F www/arch.tcl 03b521d252575f93b9c52f7c8b0007011512fcfb
|
F www/arch.tcl 03b521d252575f93b9c52f7c8b0007011512fcfb
|
||||||
F www/c_interface.tcl 8e8d9e66e8467c5751116c3427296bde77f474a6
|
F www/c_interface.tcl 8e8d9e66e8467c5751116c3427296bde77f474a6
|
||||||
F www/changes.tcl c02f83b3fb83cc6450000f66c4f751306e0fee14
|
F www/changes.tcl 8c2ecc905283cfe3221722d8e8bcb660af2297b2
|
||||||
F www/crosscompile.tcl c99efacb3aefaa550c6e80d91b240f55eb9fd33e
|
F www/crosscompile.tcl c99efacb3aefaa550c6e80d91b240f55eb9fd33e
|
||||||
|
F www/download.tcl 3e51c9ff1326b0a182846134987301310dff7d60
|
||||||
F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c
|
F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c
|
||||||
F www/index.tcl 998f61fe69be9f1b04e403c8efb75bca92710e83
|
F www/index.tcl 68c815d64b35b2dcc4d4f6845827df71c6869f9f
|
||||||
F www/lang.tcl 33a74d727615ccbee8be7c8efd5876ce008c4b0e
|
F www/lang.tcl 33a74d727615ccbee8be7c8efd5876ce008c4b0e
|
||||||
F www/mingw.tcl fc5f4ba9d336b6e8c97347cc6496d6162461ef60
|
F www/mingw.tcl fc5f4ba9d336b6e8c97347cc6496d6162461ef60
|
||||||
F www/opcode.tcl 4365ad9798872491dbd7d3071510ebe461785ac3
|
F www/opcode.tcl 4365ad9798872491dbd7d3071510ebe461785ac3
|
||||||
@ -111,7 +112,7 @@ F www/speed.tcl ab7d6d3bc898472bd94320a5d3c63de928d4804b
|
|||||||
F www/sqlite.tcl 6a21242a272e9c0939a04419a51c3d50cae33e3e
|
F www/sqlite.tcl 6a21242a272e9c0939a04419a51c3d50cae33e3e
|
||||||
F www/tclsqlite.tcl 13d50723f583888fc80ae1a38247c0ab415066fa
|
F www/tclsqlite.tcl 13d50723f583888fc80ae1a38247c0ab415066fa
|
||||||
F www/vdbe.tcl bb7d620995f0a987293e9d4fb6185a3b077e9b44
|
F www/vdbe.tcl bb7d620995f0a987293e9d4fb6185a3b077e9b44
|
||||||
P 4b7710e2daadffb716bd88f3a213f94ffbb750ef
|
P e4980849403a8d7bd63753c9b7f275519bd7df4f
|
||||||
R 749797abfff4d2facdf1fb82f0e97dc2
|
R 7502c066a19df2a451414aa8e23b0cac
|
||||||
U drh
|
U drh
|
||||||
Z 53199e04c7e509c37ae5c48d753ad83b
|
Z 47fec5ca7cd29a261f31f63e809cee33
|
||||||
|
@ -1 +1 @@
|
|||||||
e4980849403a8d7bd63753c9b7f275519bd7df4f
|
b63b3f3684a3d584ef99f54cde76b6c483bbfef7
|
@ -9,7 +9,7 @@
|
|||||||
** May you share freely, never taking more than you give.
|
** May you share freely, never taking more than you give.
|
||||||
**
|
**
|
||||||
*************************************************************************
|
*************************************************************************
|
||||||
** $Id: btree.c,v 1.32 2001/10/02 13:01:49 drh Exp $
|
** $Id: btree.c,v 1.33 2001/10/06 16:33:02 drh Exp $
|
||||||
**
|
**
|
||||||
** This file implements a external (disk-based) database using BTrees.
|
** This file implements a external (disk-based) database using BTrees.
|
||||||
** For a detailed discussion of BTrees, refer to
|
** For a detailed discussion of BTrees, refer to
|
||||||
@ -595,6 +595,10 @@ static void pageDestructor(void *pData){
|
|||||||
** Actually, this routine just sets up the internal data structures
|
** Actually, this routine just sets up the internal data structures
|
||||||
** for accessing the database. We do not open the database file
|
** for accessing the database. We do not open the database file
|
||||||
** until the first page is loaded.
|
** until the first page is loaded.
|
||||||
|
**
|
||||||
|
** zFilename is the name of the database file. If zFilename is NULL
|
||||||
|
** a new database with a random name is created. The database will be
|
||||||
|
** destroyed when sqliteBtreeClose() is called.
|
||||||
*/
|
*/
|
||||||
int sqliteBtreeOpen(
|
int sqliteBtreeOpen(
|
||||||
const char *zFilename, /* Name of the file containing the BTree database */
|
const char *zFilename, /* Name of the file containing the BTree database */
|
||||||
|
133
src/build.c
133
src/build.c
@ -25,7 +25,7 @@
|
|||||||
** ROLLBACK
|
** ROLLBACK
|
||||||
** PRAGMA
|
** PRAGMA
|
||||||
**
|
**
|
||||||
** $Id: build.c,v 1.43 2001/09/27 15:11:54 drh Exp $
|
** $Id: build.c,v 1.44 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@ -203,6 +203,7 @@ void sqliteDeleteTable(sqlite *db, Table *pTable){
|
|||||||
for(i=0; i<pTable->nCol; i++){
|
for(i=0; i<pTable->nCol; i++){
|
||||||
sqliteFree(pTable->aCol[i].zName);
|
sqliteFree(pTable->aCol[i].zName);
|
||||||
sqliteFree(pTable->aCol[i].zDflt);
|
sqliteFree(pTable->aCol[i].zDflt);
|
||||||
|
sqliteFree(pTable->aCol[i].zType);
|
||||||
}
|
}
|
||||||
for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
|
for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){
|
||||||
pNext = pIndex->pNext;
|
pNext = pIndex->pNext;
|
||||||
@ -335,7 +336,7 @@ char *sqliteTableNameFromToken(Token *pName){
|
|||||||
** after seeing tokens "CREATE" and "TABLE" and the table name. The
|
** after seeing tokens "CREATE" and "TABLE" and the table name. The
|
||||||
** pStart token is the CREATE and pName is the table name.
|
** pStart token is the CREATE and pName is the table name.
|
||||||
**
|
**
|
||||||
** The new table is constructed in files of the pParse structure. As
|
** The new table is constructed in fields of the pParse structure. As
|
||||||
** more of the CREATE TABLE statement is parsed, additional action
|
** more of the CREATE TABLE statement is parsed, additional action
|
||||||
** routines are called to build up more of the table.
|
** routines are called to build up more of the table.
|
||||||
*/
|
*/
|
||||||
@ -406,6 +407,48 @@ void sqliteAddColumn(Parse *pParse, Token *pName){
|
|||||||
sqliteDequote(*pz);
|
sqliteDequote(*pz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This routine is called by the parser while in the middle of
|
||||||
|
** parsing a CREATE TABLE statement. A "NOT NULL" constraint has
|
||||||
|
** been seen on a column. This routine sets the notNull flag on
|
||||||
|
** the column currently under construction.
|
||||||
|
*/
|
||||||
|
void sqliteAddNotNull(Parse *pParse){
|
||||||
|
Table *p;
|
||||||
|
int i;
|
||||||
|
if( (p = pParse->pNewTable)==0 ) return;
|
||||||
|
i = p->nCol-1;
|
||||||
|
p->aCol[i].notNull = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This routine is called by the parser while in the middle of
|
||||||
|
** parsing a CREATE TABLE statement. The pFirst token is the first
|
||||||
|
** token in the sequence of tokens that describe the type of the
|
||||||
|
** column currently under construction. pLast is the last token
|
||||||
|
** in the sequence. Use this information to construct a string
|
||||||
|
** that contains the typename of the column and store that string
|
||||||
|
** in zType.
|
||||||
|
*/
|
||||||
|
void sqliteAddColumnType(Parse *pParse, Token *pFirst, Token *pLast){
|
||||||
|
Table *p;
|
||||||
|
int i, j;
|
||||||
|
int n;
|
||||||
|
char *z, **pz;
|
||||||
|
if( (p = pParse->pNewTable)==0 ) return;
|
||||||
|
i = p->nCol-1;
|
||||||
|
pz = &p->aCol[i].zType;
|
||||||
|
n = pLast->n + ((int)pLast->z) - (int)pFirst->z;
|
||||||
|
sqliteSetNString(pz, pFirst->z, n, 0);
|
||||||
|
z = *pz;
|
||||||
|
for(i=j=0; z[i]; i++){
|
||||||
|
int c = z[i];
|
||||||
|
if( isspace(c) ) continue;
|
||||||
|
z[j++] = c;
|
||||||
|
}
|
||||||
|
z[j] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The given token is the default value for the last column added to
|
** The given token is the default value for the last column added to
|
||||||
** the table currently under construction. If "minusFlag" is true, it
|
** the table currently under construction. If "minusFlag" is true, it
|
||||||
@ -486,9 +529,7 @@ void sqliteEndTable(Parse *pParse, Token *pEnd){
|
|||||||
** "sqlite_master" table on the disk. So do not write to the disk
|
** "sqlite_master" table on the disk. So do not write to the disk
|
||||||
** again. Extract the root page number for the table from the
|
** again. Extract the root page number for the table from the
|
||||||
** pParse->newTnum field. (The page number should have been put
|
** pParse->newTnum field. (The page number should have been put
|
||||||
** there by the sqliteOpenCb routine.) If the table has a primary
|
** there by the sqliteOpenCb routine.)
|
||||||
** key, the root page of the index associated with the primary key
|
|
||||||
** should be in pParse->newKnum.
|
|
||||||
*/
|
*/
|
||||||
if( pParse->initFlag ){
|
if( pParse->initFlag ){
|
||||||
p->tnum = pParse->newTnum;
|
p->tnum = pParse->newTnum;
|
||||||
@ -618,11 +659,12 @@ void sqliteDropTable(Parse *pParse, Token *pName){
|
|||||||
** and pTable is the name of the table that is to be indexed. Both will
|
** and pTable is the name of the table that is to be indexed. Both will
|
||||||
** be NULL for a primary key or an index that is created to satisfy a
|
** be NULL for a primary key or an index that is created to satisfy a
|
||||||
** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable
|
** UNIQUE constraint. If pTable and pIndex are NULL, use pParse->pNewTable
|
||||||
** as the table to be indexed.
|
** as the table to be indexed. pParse->pNewTable is a table that is
|
||||||
|
** currently being constructed by a CREATE TABLE statement.
|
||||||
**
|
**
|
||||||
** pList is a list of columns to be indexed. pList will be NULL if the
|
** pList is a list of columns to be indexed. pList will be NULL if this
|
||||||
** most recently added column of the table is the primary key or has
|
** is a primary key or unique-constraint on the most recent column added
|
||||||
** the UNIQUE constraint.
|
** to the table currently under construction.
|
||||||
*/
|
*/
|
||||||
void sqliteCreateIndex(
|
void sqliteCreateIndex(
|
||||||
Parse *pParse, /* All information about this parse */
|
Parse *pParse, /* All information about this parse */
|
||||||
@ -763,10 +805,9 @@ void sqliteCreateIndex(
|
|||||||
** we don't want to recreate it.
|
** we don't want to recreate it.
|
||||||
**
|
**
|
||||||
** If pTable==0 it means this index is generated as a primary key
|
** If pTable==0 it means this index is generated as a primary key
|
||||||
** or UNIQUE constraint of a CREATE TABLE statement. The code generator
|
** or UNIQUE constraint of a CREATE TABLE statement. Since the table
|
||||||
** for CREATE TABLE will have already opened cursor 0 for writing to
|
** has just been created, it contains no data and the index initialization
|
||||||
** the sqlite_master table and will take care of closing that cursor
|
** step can be skipped.
|
||||||
** for us in the end. So those steps are skipped when pTable==0
|
|
||||||
*/
|
*/
|
||||||
else if( pParse->initFlag==0 ){
|
else if( pParse->initFlag==0 ){
|
||||||
int n;
|
int n;
|
||||||
@ -796,12 +837,10 @@ void sqliteCreateIndex(
|
|||||||
sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
|
sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
|
||||||
sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0, 0, 0);
|
sqliteVdbeAddOp(v, OP_OpenWrite, 1, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
|
||||||
if( pStart && pEnd ){
|
if( pStart && pEnd ){
|
||||||
n = (int)pEnd->z - (int)pStart->z + 1;
|
n = (int)pEnd->z - (int)pStart->z + 1;
|
||||||
addr = sqliteVdbeAddOp(v, OP_String, 0, 0, "", 0);
|
|
||||||
sqliteVdbeChangeP3(v, addr, pStart->z, n);
|
sqliteVdbeChangeP3(v, addr, pStart->z, n);
|
||||||
}else{
|
|
||||||
sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
|
|
||||||
}
|
}
|
||||||
sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0, 0, 0);
|
sqliteVdbeAddOp(v, OP_MakeRecord, 5, 0, 0, 0);
|
||||||
sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0);
|
sqliteVdbeAddOp(v, OP_Put, 0, 0, 0, 0);
|
||||||
@ -1262,6 +1301,68 @@ void sqlitePragma(Parse *pParse, Token *pLeft, Token *pRight, int minusFlag){
|
|||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
|
|
||||||
|
if( sqliteStrICmp(zLeft, "full_column_names")==0 ){
|
||||||
|
if( getBoolean(zRight) ){
|
||||||
|
db->flags |= SQLITE_FullColNames;
|
||||||
|
}else{
|
||||||
|
db->flags &= ~SQLITE_FullColNames;
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
|
||||||
|
if( sqliteStrICmp(zLeft, "table_info")==0 ){
|
||||||
|
Table *pTab;
|
||||||
|
Vdbe *v;
|
||||||
|
pTab = sqliteFindTable(db, zRight);
|
||||||
|
if( pTab ) v = sqliteGetVdbe(pParse);
|
||||||
|
if( pTab && v ){
|
||||||
|
static VdbeOp tableInfoPreface[] = {
|
||||||
|
{ OP_ColumnCount, 5, 0, 0},
|
||||||
|
{ OP_ColumnName, 0, 0, "cid"},
|
||||||
|
{ OP_ColumnName, 1, 0, "name"},
|
||||||
|
{ OP_ColumnName, 2, 0, "type"},
|
||||||
|
{ OP_ColumnName, 3, 0, "notnull"},
|
||||||
|
{ OP_ColumnName, 4, 0, "dflt_value"},
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface);
|
||||||
|
for(i=0; i<pTab->nCol; i++){
|
||||||
|
sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zName, 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_String, 0, 0,
|
||||||
|
pTab->aCol[i].zType ? pTab->aCol[i].zType : "text", 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_Integer, pTab->aCol[i].notNull, 0, 0, 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zDflt, 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_Callback, 5, 0, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
|
||||||
|
if( sqliteStrICmp(zLeft, "index_info")==0 ){
|
||||||
|
Index *pIdx;
|
||||||
|
Table *pTab;
|
||||||
|
Vdbe *v;
|
||||||
|
pIdx = sqliteFindIndex(db, zRight);
|
||||||
|
if( pIdx ) v = sqliteGetVdbe(pParse);
|
||||||
|
if( pIdx && v ){
|
||||||
|
static VdbeOp tableInfoPreface[] = {
|
||||||
|
{ OP_ColumnCount, 3, 0, 0},
|
||||||
|
{ OP_ColumnName, 0, 0, "seqno"},
|
||||||
|
{ OP_ColumnName, 1, 0, "cid"},
|
||||||
|
{ OP_ColumnName, 2, 0, "name"},
|
||||||
|
};
|
||||||
|
int i;
|
||||||
|
pTab = pIdx->pTable;
|
||||||
|
sqliteVdbeAddOpList(v, ArraySize(tableInfoPreface), tableInfoPreface);
|
||||||
|
for(i=0; i<pIdx->nColumn; i++){
|
||||||
|
sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_Integer, pIdx->aiColumn[i], 0, 0, 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_String, 0, 0,
|
||||||
|
pTab->aCol[pIdx->aiColumn[i]].zName, 0);
|
||||||
|
sqliteVdbeAddOp(v, OP_Callback, 3, 0, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if( sqliteStrICmp(zLeft, "parser_trace")==0 ){
|
if( sqliteStrICmp(zLeft, "parser_trace")==0 ){
|
||||||
extern void sqliteParserTrace(FILE*, char *);
|
extern void sqliteParserTrace(FILE*, char *);
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
** This file contains routines used for analyzing expressions and
|
** This file contains routines used for analyzing expressions and
|
||||||
** for generating VDBE code that evaluates expressions in SQLite.
|
** for generating VDBE code that evaluates expressions in SQLite.
|
||||||
**
|
**
|
||||||
** $Id: expr.c,v 1.28 2001/09/16 00:13:27 drh Exp $
|
** $Id: expr.c,v 1.29 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@ -526,7 +526,7 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_NULL: {
|
case TK_NULL: {
|
||||||
sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
|
sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TK_AND:
|
case TK_AND:
|
||||||
|
16
src/insert.c
16
src/insert.c
@ -12,7 +12,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** to handle INSERT statements in SQLite.
|
** to handle INSERT statements in SQLite.
|
||||||
**
|
**
|
||||||
** $Id: insert.c,v 1.20 2001/09/27 03:22:33 drh Exp $
|
** $Id: insert.c,v 1.21 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@ -186,12 +186,7 @@ void sqliteInsert(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pColumn && j>=pColumn->nId ){
|
if( pColumn && j>=pColumn->nId ){
|
||||||
char *zDflt = pTab->aCol[i].zDflt;
|
sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[i].zDflt, 0);
|
||||||
if( zDflt==0 ){
|
|
||||||
sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
|
|
||||||
}else{
|
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0, zDflt, 0);
|
|
||||||
}
|
|
||||||
}else if( srcTab>=0 ){
|
}else if( srcTab>=0 ){
|
||||||
sqliteVdbeAddOp(v, OP_Column, srcTab, i, 0, 0);
|
sqliteVdbeAddOp(v, OP_Column, srcTab, i, 0, 0);
|
||||||
}else{
|
}else{
|
||||||
@ -218,12 +213,7 @@ void sqliteInsert(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( pColumn && j>=pColumn->nId ){
|
if( pColumn && j>=pColumn->nId ){
|
||||||
char *zDflt = pTab->aCol[idx].zDflt;
|
sqliteVdbeAddOp(v, OP_String, 0, 0, pTab->aCol[idx].zDflt, 0);
|
||||||
if( zDflt==0 ){
|
|
||||||
sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
|
|
||||||
}else{
|
|
||||||
sqliteVdbeAddOp(v, OP_String, 0, 0, zDflt, 0);
|
|
||||||
}
|
|
||||||
}else if( srcTab>=0 ){
|
}else if( srcTab>=0 ){
|
||||||
sqliteVdbeAddOp(v, OP_Column, srcTab, idx, 0, 0);
|
sqliteVdbeAddOp(v, OP_Column, srcTab, idx, 0, 0);
|
||||||
}else{
|
}else{
|
||||||
|
35
src/main.c
35
src/main.c
@ -14,14 +14,16 @@
|
|||||||
** other files are for internal use by SQLite and should not be
|
** other files are for internal use by SQLite and should not be
|
||||||
** accessed by users of the library.
|
** accessed by users of the library.
|
||||||
**
|
**
|
||||||
** $Id: main.c,v 1.42 2001/09/27 15:11:54 drh Exp $
|
** $Id: main.c,v 1.43 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** This is the callback routine for the code that initializes the
|
** This is the callback routine for the code that initializes the
|
||||||
** database. Each callback contains the following information:
|
** database. See sqliteInit() below for additional information.
|
||||||
|
**
|
||||||
|
** Each callback contains the following information:
|
||||||
**
|
**
|
||||||
** argv[0] = "meta" or "table" or "index"
|
** argv[0] = "meta" or "table" or "index"
|
||||||
** argv[1] = table or index name or meta statement type.
|
** argv[1] = table or index name or meta statement type.
|
||||||
@ -34,8 +36,9 @@ static int sqliteOpenCb(void *pDb, int argc, char **argv, char **azColName){
|
|||||||
Parse sParse;
|
Parse sParse;
|
||||||
int nErr = 0;
|
int nErr = 0;
|
||||||
|
|
||||||
/* TODO: Do some validity checks on all fields. In particular,
|
/* TODO: Do some validity checks on all fields. In particular,
|
||||||
** make sure fields do not contain NULLs. */
|
** make sure fields do not contain NULLs. Otherwise we might core
|
||||||
|
** when attempting to initialize from a corrupt database file. */
|
||||||
|
|
||||||
assert( argc==4 );
|
assert( argc==4 );
|
||||||
switch( argv[0][0] ){
|
switch( argv[0][0] ){
|
||||||
@ -51,12 +54,23 @@ static int sqliteOpenCb(void *pDb, int argc, char **argv, char **azColName){
|
|||||||
case 'i':
|
case 'i':
|
||||||
case 't': { /* CREATE TABLE and CREATE INDEX statements */
|
case 't': { /* CREATE TABLE and CREATE INDEX statements */
|
||||||
if( argv[3] && argv[3][0] ){
|
if( argv[3] && argv[3][0] ){
|
||||||
|
/* Call the parser to process a CREATE TABLE or CREATE INDEX statement.
|
||||||
|
** But because sParse.initFlag is set to 1, no VDBE code is generated
|
||||||
|
** or executed. All the parser does is build the internal data
|
||||||
|
** structures that describe the table or index.
|
||||||
|
*/
|
||||||
memset(&sParse, 0, sizeof(sParse));
|
memset(&sParse, 0, sizeof(sParse));
|
||||||
sParse.db = db;
|
sParse.db = db;
|
||||||
sParse.initFlag = 1;
|
sParse.initFlag = 1;
|
||||||
sParse.newTnum = atoi(argv[2]);
|
sParse.newTnum = atoi(argv[2]);
|
||||||
nErr = sqliteRunParser(&sParse, argv[3], 0);
|
nErr = sqliteRunParser(&sParse, argv[3], 0);
|
||||||
}else{
|
}else{
|
||||||
|
/* If the SQL column is blank it means this is an index that
|
||||||
|
** was created to be the PRIMARY KEY or to fulfill a UNIQUE
|
||||||
|
** constraint or a CREATE TABLE. The index should have already
|
||||||
|
** been created when we processed the CREATE TABLE. All we have
|
||||||
|
** to do here is record the root page.
|
||||||
|
*/
|
||||||
Index *pIndex = sqliteFindIndex(db, argv[1]);
|
Index *pIndex = sqliteFindIndex(db, argv[1]);
|
||||||
if( pIndex==0 || pIndex->tnum!=0 ){
|
if( pIndex==0 || pIndex->tnum!=0 ){
|
||||||
nErr++;
|
nErr++;
|
||||||
@ -123,9 +137,12 @@ static int sqliteInit(sqlite *db, char **pzErrMsg){
|
|||||||
** The "tbl_name" is the name of the associated table. For tables,
|
** The "tbl_name" is the name of the associated table. For tables,
|
||||||
** the tbl_name column is always the same as name. For indices, the
|
** the tbl_name column is always the same as name. For indices, the
|
||||||
** tbl_name column contains the name of the table that the index
|
** tbl_name column contains the name of the table that the index
|
||||||
** indexes. Finally, the "sql" column contains the complete text of
|
** indexes. The "rootpage" column holds the number of the root page
|
||||||
** the CREATE TABLE or CREATE INDEX statement that originally created
|
** for the b-tree for the table or index. Finally, the "sql" column
|
||||||
** the table or index.
|
** contains the complete text of the CREATE TABLE or CREATE INDEX
|
||||||
|
** statement that originally created the table or index. If an index
|
||||||
|
** was created to fulfill a PRIMARY KEY or UNIQUE constraint on a table,
|
||||||
|
** then the "sql" column is NULL.
|
||||||
**
|
**
|
||||||
** If the "type" column has the value "meta", then the "sql" column
|
** If the "type" column has the value "meta", then the "sql" column
|
||||||
** contains extra information about the database, such as the
|
** contains extra information about the database, such as the
|
||||||
@ -175,7 +192,7 @@ static int sqliteInit(sqlite *db, char **pzErrMsg){
|
|||||||
{ OP_Goto, 0, 24, 0},
|
{ OP_Goto, 0, 24, 0},
|
||||||
{ OP_String, 0, 0, "meta"}, /* 34 */
|
{ OP_String, 0, 0, "meta"}, /* 34 */
|
||||||
{ OP_String, 0, 0, "schema-cookie"},
|
{ OP_String, 0, 0, "schema-cookie"},
|
||||||
{ OP_Null, 0, 0, 0},
|
{ OP_String, 0, 0, 0},
|
||||||
{ OP_ReadCookie,0,0, 0},
|
{ OP_ReadCookie,0,0, 0},
|
||||||
{ OP_Callback, 4, 0, 0},
|
{ OP_Callback, 4, 0, 0},
|
||||||
{ OP_Close, 0, 0, 0},
|
{ OP_Close, 0, 0, 0},
|
||||||
@ -183,7 +200,7 @@ static int sqliteInit(sqlite *db, char **pzErrMsg){
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Create a virtual machine to run the initialization program. Run
|
/* Create a virtual machine to run the initialization program. Run
|
||||||
** the program. The delete the virtual machine.
|
** the program. Then delete the virtual machine.
|
||||||
*/
|
*/
|
||||||
vdbe = sqliteVdbeCreate(db);
|
vdbe = sqliteVdbeCreate(db);
|
||||||
if( vdbe==0 ){
|
if( vdbe==0 ){
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
** file simultaneously, or one process from reading the database while
|
** file simultaneously, or one process from reading the database while
|
||||||
** another is writing.
|
** another is writing.
|
||||||
**
|
**
|
||||||
** @(#) $Id: pager.c,v 1.24 2001/09/20 01:44:43 drh Exp $
|
** @(#) $Id: pager.c,v 1.25 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "pager.h"
|
#include "pager.h"
|
||||||
@ -377,6 +377,10 @@ void sqlitepager_set_cachesize(Pager *pPager, int mxPage){
|
|||||||
** The file to be cached need not exist. The file is not locked until
|
** The file to be cached need not exist. The file is not locked until
|
||||||
** the first call to sqlitepager_get() and is only held open until the
|
** the first call to sqlitepager_get() and is only held open until the
|
||||||
** last page is released using sqlitepager_unref().
|
** last page is released using sqlitepager_unref().
|
||||||
|
**
|
||||||
|
** If zFilename is NULL then a random temporary file is created and used
|
||||||
|
** as the file to be cached. The file will be deleted automatically when
|
||||||
|
** it is closed.
|
||||||
*/
|
*/
|
||||||
int sqlitepager_open(
|
int sqlitepager_open(
|
||||||
Pager **ppPager, /* Return the Pager structure here */
|
Pager **ppPager, /* Return the Pager structure here */
|
||||||
|
60
src/parse.y
60
src/parse.y
@ -14,7 +14,7 @@
|
|||||||
** the parser. Lemon will also generate a header file containing
|
** the parser. Lemon will also generate a header file containing
|
||||||
** numeric codes for all of the tokens.
|
** numeric codes for all of the tokens.
|
||||||
**
|
**
|
||||||
** @(#) $Id: parse.y,v 1.33 2001/10/01 14:29:23 drh Exp $
|
** @(#) $Id: parse.y,v 1.34 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
%token_prefix TK_
|
%token_prefix TK_
|
||||||
%token_type {Token}
|
%token_type {Token}
|
||||||
@ -49,9 +49,7 @@ ecmd ::= cmd. {sqliteExec(pParse);}
|
|||||||
ecmd ::= .
|
ecmd ::= .
|
||||||
explain ::= EXPLAIN. {pParse->explain = 1;}
|
explain ::= EXPLAIN. {pParse->explain = 1;}
|
||||||
|
|
||||||
// Begin and end transactions. Transaction support is sparse.
|
///////////////////// Begin and end transactions. ////////////////////////////
|
||||||
// Some backends support only COMMIT and not ROLLBACK. There can
|
|
||||||
// be only a single active transaction at a time.
|
|
||||||
//
|
//
|
||||||
cmd ::= BEGIN trans_opt. {sqliteBeginTransaction(pParse);}
|
cmd ::= BEGIN trans_opt. {sqliteBeginTransaction(pParse);}
|
||||||
trans_opt ::= .
|
trans_opt ::= .
|
||||||
@ -61,7 +59,7 @@ cmd ::= COMMIT trans_opt. {sqliteCommitTransaction(pParse);}
|
|||||||
cmd ::= END trans_opt. {sqliteCommitTransaction(pParse);}
|
cmd ::= END trans_opt. {sqliteCommitTransaction(pParse);}
|
||||||
cmd ::= ROLLBACK trans_opt. {sqliteRollbackTransaction(pParse);}
|
cmd ::= ROLLBACK trans_opt. {sqliteRollbackTransaction(pParse);}
|
||||||
|
|
||||||
// The first form of a command is a CREATE TABLE statement.
|
///////////////////// The CREATE TABLE statement ////////////////////////////
|
||||||
//
|
//
|
||||||
cmd ::= create_table create_table_args.
|
cmd ::= create_table create_table_args.
|
||||||
create_table ::= CREATE(X) TABLE ids(Y). {sqliteStartTable(pParse,&X,&Y);}
|
create_table ::= CREATE(X) TABLE ids(Y). {sqliteStartTable(pParse,&X,&Y);}
|
||||||
@ -79,7 +77,8 @@ columnid ::= ids(X). {sqliteAddColumn(pParse,&X);}
|
|||||||
|
|
||||||
// An IDENTIFIER can be a generic identifier, or one of several
|
// An IDENTIFIER can be a generic identifier, or one of several
|
||||||
// keywords. Any non-standard keyword can also be an identifier.
|
// keywords. Any non-standard keyword can also be an identifier.
|
||||||
// We also make DESC and identifier since it comes up so often.
|
// We also make DESC and identifier since it comes up so often (as
|
||||||
|
// an abbreviation of "description").
|
||||||
//
|
//
|
||||||
%type id {Token}
|
%type id {Token}
|
||||||
id(A) ::= DESC(X). {A = X;}
|
id(A) ::= DESC(X). {A = X;}
|
||||||
@ -99,11 +98,14 @@ id(A) ::= ID(X). {A = X;}
|
|||||||
ids(A) ::= id(X). {A = X;}
|
ids(A) ::= id(X). {A = X;}
|
||||||
ids(A) ::= STRING(X). {A = X;}
|
ids(A) ::= STRING(X). {A = X;}
|
||||||
|
|
||||||
type ::= typename.
|
type ::= .
|
||||||
type ::= typename LP signed RP.
|
type ::= typename(X). {sqliteAddColumnType(pParse,&X,&X);}
|
||||||
type ::= typename LP signed COMMA signed RP.
|
type ::= typename(X) LP signed RP(Y). {sqliteAddColumnType(pParse,&X,&Y);}
|
||||||
typename ::= ids.
|
type ::= typename(X) LP signed COMMA signed RP(Y).
|
||||||
typename ::= typename ids.
|
{sqliteAddColumnType(pParse,&X,&Y);}
|
||||||
|
%type typename {Token}
|
||||||
|
typename(A) ::= ids(X). {A = X;}
|
||||||
|
typename(A) ::= typename(X) ids. {A = X;}
|
||||||
signed ::= INTEGER.
|
signed ::= INTEGER.
|
||||||
signed ::= PLUS INTEGER.
|
signed ::= PLUS INTEGER.
|
||||||
signed ::= MINUS INTEGER.
|
signed ::= MINUS INTEGER.
|
||||||
@ -121,15 +123,16 @@ carg ::= DEFAULT PLUS FLOAT(X). {sqliteAddDefaultValue(pParse,&X,0);}
|
|||||||
carg ::= DEFAULT MINUS FLOAT(X). {sqliteAddDefaultValue(pParse,&X,1);}
|
carg ::= DEFAULT MINUS FLOAT(X). {sqliteAddDefaultValue(pParse,&X,1);}
|
||||||
carg ::= DEFAULT NULL.
|
carg ::= DEFAULT NULL.
|
||||||
|
|
||||||
// In addition to the type name, we also care about the primary key.
|
// In addition to the type name, we also care about the primary key and
|
||||||
|
// UNIQUE constraints.
|
||||||
//
|
//
|
||||||
ccons ::= NOT NULL.
|
ccons ::= NOT NULL. {sqliteAddNotNull(pParse);}
|
||||||
ccons ::= PRIMARY KEY sortorder. {sqliteCreateIndex(pParse,0,0,0,1,0,0);}
|
ccons ::= PRIMARY KEY sortorder. {sqliteCreateIndex(pParse,0,0,0,1,0,0);}
|
||||||
ccons ::= UNIQUE. {sqliteCreateIndex(pParse,0,0,0,1,0,0);}
|
ccons ::= UNIQUE. {sqliteCreateIndex(pParse,0,0,0,1,0,0);}
|
||||||
ccons ::= CHECK LP expr RP.
|
ccons ::= CHECK LP expr RP.
|
||||||
|
|
||||||
// For the time being, the only constraint we care about is the primary
|
// For the time being, the only constraint we care about is the primary
|
||||||
// key.
|
// key and UNIQUE. Both create indices.
|
||||||
//
|
//
|
||||||
conslist_opt ::= .
|
conslist_opt ::= .
|
||||||
conslist_opt ::= COMMA conslist.
|
conslist_opt ::= COMMA conslist.
|
||||||
@ -140,14 +143,12 @@ tcons ::= CONSTRAINT ids.
|
|||||||
tcons ::= PRIMARY KEY LP idxlist(X) RP. {sqliteCreateIndex(pParse,0,0,X,1,0,0);}
|
tcons ::= PRIMARY KEY LP idxlist(X) RP. {sqliteCreateIndex(pParse,0,0,X,1,0,0);}
|
||||||
tcons ::= UNIQUE LP idxlist(X) RP. {sqliteCreateIndex(pParse,0,0,X,1,0,0);}
|
tcons ::= UNIQUE LP idxlist(X) RP. {sqliteCreateIndex(pParse,0,0,X,1,0,0);}
|
||||||
tcons ::= CHECK expr.
|
tcons ::= CHECK expr.
|
||||||
// idlist ::= idlist COMMA ids.
|
|
||||||
// idlist ::= ids.
|
|
||||||
|
|
||||||
// The next command format is dropping tables.
|
////////////////////////// The DROP TABLE /////////////////////////////////////
|
||||||
//
|
//
|
||||||
cmd ::= DROP TABLE ids(X). {sqliteDropTable(pParse,&X);}
|
cmd ::= DROP TABLE ids(X). {sqliteDropTable(pParse,&X);}
|
||||||
|
|
||||||
// The select statement
|
//////////////////////// The SELECT statement /////////////////////////////////
|
||||||
//
|
//
|
||||||
cmd ::= select(X). {
|
cmd ::= select(X). {
|
||||||
sqliteSelect(pParse, X, SRT_Callback, 0);
|
sqliteSelect(pParse, X, SRT_Callback, 0);
|
||||||
@ -253,7 +254,8 @@ groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;}
|
|||||||
having_opt(A) ::= . {A = 0;}
|
having_opt(A) ::= . {A = 0;}
|
||||||
having_opt(A) ::= HAVING expr(X). {A = X;}
|
having_opt(A) ::= HAVING expr(X). {A = X;}
|
||||||
|
|
||||||
|
/////////////////////////// The DELETE statement /////////////////////////////
|
||||||
|
//
|
||||||
cmd ::= DELETE FROM ids(X) where_opt(Y).
|
cmd ::= DELETE FROM ids(X) where_opt(Y).
|
||||||
{sqliteDeleteFrom(pParse, &X, Y);}
|
{sqliteDeleteFrom(pParse, &X, Y);}
|
||||||
|
|
||||||
@ -266,6 +268,8 @@ where_opt(A) ::= WHERE expr(X). {A = X;}
|
|||||||
%type setlist {ExprList*}
|
%type setlist {ExprList*}
|
||||||
%destructor setlist {sqliteExprListDelete($$);}
|
%destructor setlist {sqliteExprListDelete($$);}
|
||||||
|
|
||||||
|
////////////////////////// The UPDATE command ////////////////////////////////
|
||||||
|
//
|
||||||
cmd ::= UPDATE ids(X) SET setlist(Y) where_opt(Z).
|
cmd ::= UPDATE ids(X) SET setlist(Y) where_opt(Z).
|
||||||
{sqliteUpdate(pParse,&X,Y,Z);}
|
{sqliteUpdate(pParse,&X,Y,Z);}
|
||||||
|
|
||||||
@ -273,6 +277,8 @@ setlist(A) ::= setlist(Z) COMMA ids(X) EQ expr(Y).
|
|||||||
{A = sqliteExprListAppend(Z,Y,&X);}
|
{A = sqliteExprListAppend(Z,Y,&X);}
|
||||||
setlist(A) ::= ids(X) EQ expr(Y). {A = sqliteExprListAppend(0,Y,&X);}
|
setlist(A) ::= ids(X) EQ expr(Y). {A = sqliteExprListAppend(0,Y,&X);}
|
||||||
|
|
||||||
|
////////////////////////// The INSERT command /////////////////////////////////
|
||||||
|
//
|
||||||
cmd ::= INSERT INTO ids(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
|
cmd ::= INSERT INTO ids(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
|
||||||
{sqliteInsert(pParse, &X, Y, 0, F);}
|
{sqliteInsert(pParse, &X, Y, 0, F);}
|
||||||
cmd ::= INSERT INTO ids(X) inscollist_opt(F) select(S).
|
cmd ::= INSERT INTO ids(X) inscollist_opt(F) select(S).
|
||||||
@ -311,6 +317,8 @@ inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;}
|
|||||||
inscollist(A) ::= inscollist(X) COMMA ids(Y). {A = sqliteIdListAppend(X,&Y);}
|
inscollist(A) ::= inscollist(X) COMMA ids(Y). {A = sqliteIdListAppend(X,&Y);}
|
||||||
inscollist(A) ::= ids(Y). {A = sqliteIdListAppend(0,&Y);}
|
inscollist(A) ::= ids(Y). {A = sqliteIdListAppend(0,&Y);}
|
||||||
|
|
||||||
|
/////////////////////////// Expression Processing /////////////////////////////
|
||||||
|
//
|
||||||
%left OR.
|
%left OR.
|
||||||
%left AND.
|
%left AND.
|
||||||
%right NOT.
|
%right NOT.
|
||||||
@ -452,7 +460,8 @@ exprlist(A) ::= expritem(X). {A = sqliteExprListAppend(0,X,0);}
|
|||||||
expritem(A) ::= expr(X). {A = X;}
|
expritem(A) ::= expr(X). {A = X;}
|
||||||
expritem(A) ::= . {A = 0;}
|
expritem(A) ::= . {A = 0;}
|
||||||
|
|
||||||
|
///////////////////////////// The CREATE INDEX command ///////////////////////
|
||||||
|
//
|
||||||
cmd ::= CREATE(S) uniqueflag(U) INDEX ids(X) ON ids(Y) LP idxlist(Z) RP(E).
|
cmd ::= CREATE(S) uniqueflag(U) INDEX ids(X) ON ids(Y) LP idxlist(Z) RP(E).
|
||||||
{sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);}
|
{sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);}
|
||||||
|
|
||||||
@ -470,20 +479,31 @@ idxlist(A) ::= idxitem(Y).
|
|||||||
{A = sqliteIdListAppend(0,&Y);}
|
{A = sqliteIdListAppend(0,&Y);}
|
||||||
idxitem(A) ::= ids(X). {A = X;}
|
idxitem(A) ::= ids(X). {A = X;}
|
||||||
|
|
||||||
|
///////////////////////////// The CREATE INDEX command ///////////////////////
|
||||||
|
//
|
||||||
|
|
||||||
cmd ::= DROP INDEX ids(X). {sqliteDropIndex(pParse, &X);}
|
cmd ::= DROP INDEX ids(X). {sqliteDropIndex(pParse, &X);}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////// The DROP INDEX command /////////////////////////
|
||||||
|
//
|
||||||
cmd ::= COPY ids(X) FROM ids(Y) USING DELIMITERS STRING(Z).
|
cmd ::= COPY ids(X) FROM ids(Y) USING DELIMITERS STRING(Z).
|
||||||
{sqliteCopy(pParse,&X,&Y,&Z);}
|
{sqliteCopy(pParse,&X,&Y,&Z);}
|
||||||
cmd ::= COPY ids(X) FROM ids(Y).
|
cmd ::= COPY ids(X) FROM ids(Y).
|
||||||
{sqliteCopy(pParse,&X,&Y,0);}
|
{sqliteCopy(pParse,&X,&Y,0);}
|
||||||
|
|
||||||
|
///////////////////////////// The VACUUM command /////////////////////////////
|
||||||
|
//
|
||||||
cmd ::= VACUUM. {sqliteVacuum(pParse,0);}
|
cmd ::= VACUUM. {sqliteVacuum(pParse,0);}
|
||||||
cmd ::= VACUUM ids(X). {sqliteVacuum(pParse,&X);}
|
cmd ::= VACUUM ids(X). {sqliteVacuum(pParse,&X);}
|
||||||
|
|
||||||
|
///////////////////////////// The PRAGMA command /////////////////////////////
|
||||||
|
//
|
||||||
cmd ::= PRAGMA ids(X) EQ ids(Y). {sqlitePragma(pParse,&X,&Y,0);}
|
cmd ::= PRAGMA ids(X) EQ ids(Y). {sqlitePragma(pParse,&X,&Y,0);}
|
||||||
cmd ::= PRAGMA ids(X) EQ ON(Y). {sqlitePragma(pParse,&X,&Y,0);}
|
cmd ::= PRAGMA ids(X) EQ ON(Y). {sqlitePragma(pParse,&X,&Y,0);}
|
||||||
cmd ::= PRAGMA ids(X) EQ plus_num(Y). {sqlitePragma(pParse,&X,&Y,0);}
|
cmd ::= PRAGMA ids(X) EQ plus_num(Y). {sqlitePragma(pParse,&X,&Y,0);}
|
||||||
cmd ::= PRAGMA ids(X) EQ minus_num(Y). {sqlitePragma(pParse,&X,&Y,1);}
|
cmd ::= PRAGMA ids(X) EQ minus_num(Y). {sqlitePragma(pParse,&X,&Y,1);}
|
||||||
|
cmd ::= PRAGMA ids(X) LP ids(Y) RP. {sqlitePragma(pParse,&X,&Y,0);}
|
||||||
plus_num(A) ::= plus_opt number(X). {A = X;}
|
plus_num(A) ::= plus_opt number(X). {A = X;}
|
||||||
minus_num(A) ::= MINUS number(X). {A = X;}
|
minus_num(A) ::= MINUS number(X). {A = X;}
|
||||||
number(A) ::= INTEGER(X). {A = X;}
|
number(A) ::= INTEGER(X). {A = X;}
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** to handle SELECT statements in SQLite.
|
** to handle SELECT statements in SQLite.
|
||||||
**
|
**
|
||||||
** $Id: select.c,v 1.37 2001/09/16 00:13:27 drh Exp $
|
** $Id: select.c,v 1.38 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@ -250,7 +250,7 @@ void generateColumnNames(Parse *pParse, IdList *pTabList, ExprList *pEList){
|
|||||||
sprintf(zName, "column%d", i+1);
|
sprintf(zName, "column%d", i+1);
|
||||||
sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0);
|
sqliteVdbeAddOp(v, OP_ColumnName, i, 0, zName, 0);
|
||||||
}else{
|
}else{
|
||||||
if( pTabList->nId>1 ){
|
if( pTabList->nId>1 || (pParse->db->flags & SQLITE_FullColNames)!=0 ){
|
||||||
char *zName = 0;
|
char *zName = 0;
|
||||||
Table *pTab = pTabList->a[p->iTable].pTab;
|
Table *pTab = pTabList->a[p->iTable].pTab;
|
||||||
char *zTab;
|
char *zTab;
|
||||||
@ -861,7 +861,7 @@ int sqliteSelect(
|
|||||||
/* Initialize the memory cell to NULL
|
/* Initialize the memory cell to NULL
|
||||||
*/
|
*/
|
||||||
if( eDest==SRT_Mem ){
|
if( eDest==SRT_Mem ){
|
||||||
sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
|
sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
|
||||||
sqliteVdbeAddOp(v, OP_MemStore, iParm, 0, 0, 0);
|
sqliteVdbeAddOp(v, OP_MemStore, iParm, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,13 +12,12 @@
|
|||||||
** This file contains code to implement the "sqlite" command line
|
** This file contains code to implement the "sqlite" command line
|
||||||
** utility for accessing SQLite databases.
|
** utility for accessing SQLite databases.
|
||||||
**
|
**
|
||||||
** $Id: shell.c,v 1.35 2001/10/01 14:29:23 drh Exp $
|
** $Id: shell.c,v 1.36 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "sqlite.h"
|
#include "sqlite.h"
|
||||||
#include <unistd.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#ifdef OS_UNIX
|
#ifdef OS_UNIX
|
||||||
# include <signal.h>
|
# include <signal.h>
|
||||||
@ -603,8 +602,6 @@ static void do_meta_command(char *zLine, sqlite *db, struct callback_data *p){
|
|||||||
}else if( strncmp(azArg[1],"html",n2)==0 ){
|
}else if( strncmp(azArg[1],"html",n2)==0 ){
|
||||||
p->mode = MODE_Html;
|
p->mode = MODE_Html;
|
||||||
}else if( strncmp(azArg[1],"insert",n2)==0 ){
|
}else if( strncmp(azArg[1],"insert",n2)==0 ){
|
||||||
char *zTab;
|
|
||||||
int k, n;
|
|
||||||
p->mode = MODE_Insert;
|
p->mode = MODE_Insert;
|
||||||
if( nArg>=3 ){
|
if( nArg>=3 ){
|
||||||
set_table_name(p, azArg[2]);
|
set_table_name(p, azArg[2]);
|
||||||
@ -908,6 +905,7 @@ int main(int argc, char **argv){
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
extern int isatty();
|
||||||
if( isatty(0) ){
|
if( isatty(0) ){
|
||||||
printf(
|
printf(
|
||||||
"SQLite version %s\n"
|
"SQLite version %s\n"
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
** This header file defines the interface that the SQLite library
|
** This header file defines the interface that the SQLite library
|
||||||
** presents to client programs.
|
** presents to client programs.
|
||||||
**
|
**
|
||||||
** @(#) $Id: sqlite.h.in,v 1.20 2001/09/27 03:22:33 drh Exp $
|
** @(#) $Id: sqlite.h.in,v 1.21 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#ifndef _SQLITE_H_
|
#ifndef _SQLITE_H_
|
||||||
#define _SQLITE_H_
|
#define _SQLITE_H_
|
||||||
@ -23,6 +23,13 @@
|
|||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "--VERS--"
|
#define SQLITE_VERSION "--VERS--"
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Make sure we can call this stuff from C++.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The version string is also compiled into the library so that a program
|
** The version string is also compiled into the library so that a program
|
||||||
** can check to make sure that the lib*.a file and the *.h file are from
|
** can check to make sure that the lib*.a file and the *.h file are from
|
||||||
@ -342,4 +349,8 @@ int sqlite_get_table_vprintf(
|
|||||||
va_list ap /* Arguments to the format string */
|
va_list ap /* Arguments to the format string */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* End of the 'extern "C"' block */
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _SQLITE_H_ */
|
#endif /* _SQLITE_H_ */
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** Internal interface definitions for SQLite.
|
** Internal interface definitions for SQLite.
|
||||||
**
|
**
|
||||||
** @(#) $Id: sqliteInt.h,v 1.56 2001/09/27 15:11:54 drh Exp $
|
** @(#) $Id: sqliteInt.h,v 1.57 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqlite.h"
|
#include "sqlite.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
@ -164,6 +164,7 @@ struct sqlite {
|
|||||||
#define SQLITE_Interrupt 0x00000004 /* Cancel current operation */
|
#define SQLITE_Interrupt 0x00000004 /* Cancel current operation */
|
||||||
#define SQLITE_InTrans 0x00000008 /* True if in a transaction */
|
#define SQLITE_InTrans 0x00000008 /* True if in a transaction */
|
||||||
#define SQLITE_InternChanges 0x00000010 /* Uncommitted Hash table changes */
|
#define SQLITE_InternChanges 0x00000010 /* Uncommitted Hash table changes */
|
||||||
|
#define SQLITE_FullColNames 0x00000020 /* Show full column names on SELECT */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Current file format version
|
** Current file format version
|
||||||
@ -177,6 +178,7 @@ struct sqlite {
|
|||||||
struct Column {
|
struct Column {
|
||||||
char *zName; /* Name of this column */
|
char *zName; /* Name of this column */
|
||||||
char *zDflt; /* Default value of this column */
|
char *zDflt; /* Default value of this column */
|
||||||
|
char *zType; /* Data type for this column */
|
||||||
int notNull; /* True if there is a NOT NULL constraint */
|
int notNull; /* True if there is a NOT NULL constraint */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -423,6 +425,8 @@ void sqliteCommitInternalChanges(sqlite*);
|
|||||||
void sqliteRollbackInternalChanges(sqlite*);
|
void sqliteRollbackInternalChanges(sqlite*);
|
||||||
void sqliteStartTable(Parse*,Token*,Token*);
|
void sqliteStartTable(Parse*,Token*,Token*);
|
||||||
void sqliteAddColumn(Parse*,Token*);
|
void sqliteAddColumn(Parse*,Token*);
|
||||||
|
void sqliteAddNotNull(Parse*);
|
||||||
|
void sqliteAddColumnType(Parse*,Token*,Token*);
|
||||||
void sqliteAddDefaultValue(Parse*,Token*,int);
|
void sqliteAddDefaultValue(Parse*,Token*,int);
|
||||||
void sqliteEndTable(Parse*,Token*);
|
void sqliteEndTable(Parse*,Token*);
|
||||||
void sqliteDropTable(Parse*, Token*);
|
void sqliteDropTable(Parse*, Token*);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
** individual tokens and sends those tokens one-by-one over to the
|
** individual tokens and sends those tokens one-by-one over to the
|
||||||
** parser for analysis.
|
** parser for analysis.
|
||||||
**
|
**
|
||||||
** $Id: tokenize.c,v 1.23 2001/09/23 02:35:53 drh Exp $
|
** $Id: tokenize.c,v 1.24 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@ -333,7 +333,6 @@ int sqliteRunParser(Parse *pParse, char *zSql, char **pzErrMsg){
|
|||||||
}
|
}
|
||||||
switch( tokenType ){
|
switch( tokenType ){
|
||||||
case TK_SPACE:
|
case TK_SPACE:
|
||||||
break;
|
|
||||||
case TK_COMMENT: {
|
case TK_COMMENT: {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
20
src/vdbe.c
20
src/vdbe.c
@ -30,11 +30,10 @@
|
|||||||
** 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.79 2001/09/27 15:11:54 drh Exp $
|
** $Id: vdbe.c,v 1.80 2001/10/06 16:33:03 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** SQL is translated into a sequence of instructions to be
|
** SQL is translated into a sequence of instructions to be
|
||||||
@ -1084,20 +1083,26 @@ case OP_Integer: {
|
|||||||
|
|
||||||
/* Opcode: String * * P3
|
/* Opcode: String * * P3
|
||||||
**
|
**
|
||||||
** The string value P3 is pushed onto the stack.
|
** The string value P3 is pushed onto the stack. If P3==0 then a
|
||||||
|
** NULL is pushed onto the stack.
|
||||||
*/
|
*/
|
||||||
case OP_String: {
|
case OP_String: {
|
||||||
int i = ++p->tos;
|
int i = ++p->tos;
|
||||||
char *z;
|
char *z;
|
||||||
VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
|
VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; )
|
||||||
z = pOp->p3;
|
z = pOp->p3;
|
||||||
if( z==0 ) z = "";
|
if( z==0 ){
|
||||||
zStack[i] = z;
|
zStack[i] = 0;
|
||||||
aStack[i].n = strlen(z) + 1;
|
aStack[i].flags = STK_Null;
|
||||||
aStack[i].flags = STK_Str;
|
}else{
|
||||||
|
zStack[i] = z;
|
||||||
|
aStack[i].n = strlen(z) + 1;
|
||||||
|
aStack[i].flags = STK_Str;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0 /* NOT USED */
|
||||||
/* Opcode: Null * * *
|
/* Opcode: Null * * *
|
||||||
**
|
**
|
||||||
** Push a NULL value onto the stack.
|
** Push a NULL value onto the stack.
|
||||||
@ -1109,6 +1114,7 @@ case OP_Null: {
|
|||||||
aStack[i].flags = STK_Null;
|
aStack[i].flags = STK_Null;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Opcode: Pop P1 * *
|
/* Opcode: Pop P1 * *
|
||||||
**
|
**
|
||||||
|
@ -11,7 +11,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 SELECT statement.
|
# focus of this file is testing the SELECT statement.
|
||||||
#
|
#
|
||||||
# $Id: select1.test,v 1.10 2001/09/16 00:13:28 drh Exp $
|
# $Id: select1.test,v 1.11 2001/10/06 16:33:03 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@ -238,6 +238,20 @@ do_test select1-6.1 {
|
|||||||
set v [catch {execsql2 {SELECT f1 FROM test1 ORDER BY f2}} msg]
|
set v [catch {execsql2 {SELECT f1 FROM test1 ORDER BY f2}} msg]
|
||||||
lappend v $msg
|
lappend v $msg
|
||||||
} {0 {f1 11 f1 33}}
|
} {0 {f1 11 f1 33}}
|
||||||
|
do_test select1-6.1.1 {
|
||||||
|
execsql {PRAGMA full_column_names=on}
|
||||||
|
set v [catch {execsql2 {SELECT f1 FROM test1 ORDER BY f2}} msg]
|
||||||
|
lappend v $msg
|
||||||
|
} {0 {f1 11 f1 33}}
|
||||||
|
do_test select1-6.1.2 {
|
||||||
|
set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
|
||||||
|
execsql {PRAGMA full_column_names=off}
|
||||||
|
lappend v $msg
|
||||||
|
} {0 {test1.f1 11 test1.f2 22}}
|
||||||
|
do_test select1-6.1.2 {
|
||||||
|
set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
|
||||||
|
lappend v $msg
|
||||||
|
} {0 {f1 11 f2 22}}
|
||||||
do_test select1-6.2 {
|
do_test select1-6.2 {
|
||||||
set v [catch {execsql2 {SELECT f1 as xyzzy FROM test1 ORDER BY f2}} msg]
|
set v [catch {execsql2 {SELECT f1 as xyzzy FROM test1 ORDER BY f2}} msg]
|
||||||
lappend v $msg
|
lappend v $msg
|
||||||
|
@ -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 {2001 Oct ? (2.0.2)} {
|
||||||
|
<li>Removed some unused "#include <unistd.h>" that were causing problems
|
||||||
|
for VC++.</li>
|
||||||
|
<li>Added the FULL_COLUMN_NAMES pragma. When set to "ON", the names of
|
||||||
|
columns are reported back as TABLE.COLUMN instead of just COLUMN.</li>
|
||||||
|
}
|
||||||
|
|
||||||
chng {2001 Oct 2 (2.0.1)} {
|
chng {2001 Oct 2 (2.0.1)} {
|
||||||
<li>Remove some C++ style comments from btree.c so that it will compile
|
<li>Remove some C++ style comments from btree.c so that it will compile
|
||||||
using compilers other than gcc.</li>
|
using compilers other than gcc.</li>
|
||||||
|
72
www/download.tcl
Normal file
72
www/download.tcl
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#
|
||||||
|
# Run this TCL script to generate HTML for the download.html file.
|
||||||
|
#
|
||||||
|
set rcsid {$Id: download.tcl,v 1.1 2001/10/06 16:33:04 drh Exp $}
|
||||||
|
|
||||||
|
puts {<html>
|
||||||
|
<head><title>SQLite Download Page</title></head>
|
||||||
|
<body bgcolor=white>
|
||||||
|
<h1 align=center>SQLite Download Page</h1>}
|
||||||
|
#<p align=center>}
|
||||||
|
#puts "This page was last modified on [lrange $rcsid 3 4] GMT<br>"
|
||||||
|
#set vers [lindex $argv 0]
|
||||||
|
#puts "The latest SQLite version is <b>$vers</b>"
|
||||||
|
#puts " created on [exec cat last_change] GMT"
|
||||||
|
#puts {</p>}
|
||||||
|
|
||||||
|
puts {<h2>Precompiled Binaries For Linux</h2>}
|
||||||
|
|
||||||
|
proc Product {file desc} {
|
||||||
|
if {![file exists $file]} return
|
||||||
|
set size [file size $file]
|
||||||
|
puts [subst {
|
||||||
|
<table cellpadding="20">
|
||||||
|
<tr>
|
||||||
|
<td width="150" align="right" valign="top">
|
||||||
|
<a href="$file">$file</a><br>($size bytes)
|
||||||
|
</td>
|
||||||
|
<td valign="top">[string trim $desc]</td>
|
||||||
|
</tr>
|
||||||
|
</table>}]
|
||||||
|
}
|
||||||
|
|
||||||
|
Product sqlite.bin.gz {
|
||||||
|
A command-line program for accessing and modifing SQLite databases.
|
||||||
|
See <a href="sqlite.html">the documentation</a> for additional information.
|
||||||
|
}
|
||||||
|
|
||||||
|
Product tclsqlite.so.gz {
|
||||||
|
Bindings for TCL. You can import this shared library into either
|
||||||
|
tclsh or wish to get SQLite database access from Tcl/Tk.
|
||||||
|
See <a href="tclsqlite.html">the documentation</a> for details.
|
||||||
|
}
|
||||||
|
|
||||||
|
puts {<h2>Precompiled Binaries For Windows</h2>}
|
||||||
|
|
||||||
|
Product sqlite.zip {
|
||||||
|
A command-line program for accessing and modifing SQLite databases.
|
||||||
|
See <a href="sqlite.html">the documentation</a> for additional information.
|
||||||
|
}
|
||||||
|
Product tclsqlite.zip {
|
||||||
|
Bindings for TCL. You can import this shared library into either
|
||||||
|
tclsh or wish to get SQLite database access from Tcl/Tk.
|
||||||
|
See <a href="tclsqlite.html">the documentation</a> for details.
|
||||||
|
}
|
||||||
|
|
||||||
|
puts {<h2>Source Code</h2>}
|
||||||
|
|
||||||
|
foreach name [lsort -dict -decreasing [glob -nocomplain sqlite-*.tar.gz]] {
|
||||||
|
regexp {sqlite-(.*)\.tar\.gz} $name match vers
|
||||||
|
Product $name "
|
||||||
|
Version $vers of the source tree including all documentation.
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
puts {
|
||||||
|
<p><hr /></p>
|
||||||
|
<p>
|
||||||
|
<a href="index.html"><img src="/goback.jpg" border=0 />
|
||||||
|
Back to the SQLite home page</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</body></html>}
|
@ -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.43 2001/09/28 23:11:24 drh Exp $}
|
set rcsid {$Id: index.tcl,v 1.44 2001/10/06 16:33:04 drh Exp $}
|
||||||
|
|
||||||
puts {<html>
|
puts {<html>
|
||||||
<head><title>SQLite: An SQL Database Engine In A C Library</title></head>
|
<head><title>SQLite: An SQL Database Engine In A C Library</title></head>
|
||||||
@ -170,6 +170,10 @@ puts {<h2>Related Sites</h2>
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|
||||||
|
<li><p>An ODBC driver for SQLite can be found at
|
||||||
|
<a href="http://www.ch-werner.de/sqliteodbc/">
|
||||||
|
http://www.ch-werner.de/sqliteodbc/</a>.</p></li>
|
||||||
|
|
||||||
<li><p>Here is a good <a href="http://w3.one.net/~jhoffman/sqltut.htm">
|
<li><p>Here is a good <a href="http://w3.one.net/~jhoffman/sqltut.htm">
|
||||||
tutorial on SQL</a>.</p></li>
|
tutorial on SQL</a>.</p></li>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user