Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | :-) (CVS 50) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
1cf2873d55b471bb3e397f90dc0868dd |
User & Date: | drh 2000-06-05 02:07:04.000 |
Context
2000-06-05
| ||
16:01 | separate Select structure (CVS 51) (check-in: ce45dea902 user: drh tags: trunk) | |
02:07 | :-) (CVS 50) (check-in: 1cf2873d55 user: drh tags: trunk) | |
2000-06-04
| ||
12:58 | rework the VDBE engine. NULL is now distinct from "" (CVS 49) (check-in: 6ea5cebf05 user: drh tags: trunk) | |
Changes
Changes to src/main.c.
︙ | ︙ | |||
22 23 24 25 26 27 28 | ** ************************************************************************* ** Main file for the SQLite library. The routines in this file ** implement the programmer interface to the library. Routines in ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** | | | | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | ** ************************************************************************* ** Main file for the SQLite library. The routines in this file ** implement the programmer interface to the library. Routines in ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** ** $Id: main.c,v 1.8 2000/06/05 02:07:04 drh Exp $ */ #include "sqliteInt.h" /* ** This is the callback routine for the code that initializes the ** database. Each callback contains text of a CREATE TABLE or ** CREATE INDEX statement that must be parsed to yield the internal ** structures that describe the tables. */ static int sqliteOpenCb(void *pDb, int argc, char **argv, char **azColName){ sqlite *db = (sqlite*)pDb; Parse sParse; int nErr; char *zErrMsg = 0; if( argc!=1 ) return 0; memset(&sParse, 0, sizeof(sParse)); sParse.db = db; sParse.initFlag = 1; nErr = sqliteRunParser(&sParse, argv[0], 0); return nErr; } /* ** Attempt to read the database schema and initialize internal ** data structures. Return one of the SQLITE_ error codes to ** indicate success or failure. |
︙ | ︙ |
Changes to src/shell.c.
︙ | ︙ | |||
20 21 22 23 24 25 26 | ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. ** | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** This file contains code to implement the "sqlite" command line ** utility for accessing SQLite databases. ** ** $Id: shell.c,v 1.8 2000/06/05 02:07:04 drh Exp $ */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include "sqlite.h" #include <unistd.h> #include <ctype.h> |
︙ | ︙ | |||
452 453 454 455 456 457 458 | } if( argc!=2 && argc!=3 ){ fprintf(stderr,"Usage: %s ?OPTIONS? FILENAME ?SQL?\n", argv0); exit(1); } db = sqlite_open(argv[1], 0666, &zErrMsg); if( db==0 ){ | > | > > > | 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 | } if( argc!=2 && argc!=3 ){ fprintf(stderr,"Usage: %s ?OPTIONS? FILENAME ?SQL?\n", argv0); exit(1); } db = sqlite_open(argv[1], 0666, &zErrMsg); if( db==0 ){ if( zErrMsg ){ fprintf(stderr,"Unable to open database \"%s\": %s\n", argv[1], zErrMsg); }else{ fprintf(stderr,"Unable to open database %s\n", argv[1]); } exit(1); } data.out = stdout; if( argc==3 ){ if( sqlite_exec(db, argv[2], callback, &data, &zErrMsg)!=0 && zErrMsg!=0 ){ fprintf(stderr,"SQL error: %s\n", zErrMsg); exit(1); |
︙ | ︙ |
Changes to src/sqliteInt.h.
︙ | ︙ | |||
19 20 21 22 23 24 25 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** Internal interface definitions for SQLite. ** | | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | ** Author contact information: ** drh@hwaci.com ** http://www.hwaci.com/drh/ ** ************************************************************************* ** Internal interface definitions for SQLite. ** ** @(#) $Id: sqliteInt.h,v 1.13 2000/06/05 02:07:04 drh Exp $ */ #include "sqlite.h" #include "dbbe.h" #include "vdbe.h" #include "parse.h" #include <gdbm.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> /* #define MEMORY_DEBUG 1 */ #ifdef MEMORY_DEBUG # define sqliteMalloc(X) sqliteMalloc_(X,__FILE__,__LINE__) # define sqliteFree(X) sqliteFree_(X,__FILE__,__LINE__) # define sqliteRealloc(X,Y) sqliteRealloc_(X,Y,__FILE__,__LINE__) void sqliteStrRealloc(char**); #else # define sqliteStrRealloc(X) |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
37 38 39 40 41 42 43 | ** inplicit conversion from one type to the other occurs as necessary. ** ** Most of the code in this file is taken up by the sqliteVdbeExec() ** function which does the work of interpreting a VDBE program. ** But other routines are also provided to help in building up ** a program instruction by instruction. ** | | | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | ** inplicit conversion from one type to the other occurs as necessary. ** ** Most of the code in this file is taken up by the sqliteVdbeExec() ** function which does the work of interpreting a VDBE program. ** But other routines are also provided to help in building up ** a program instruction by instruction. ** ** $Id: vdbe.c,v 1.14 2000/06/05 02:07:04 drh Exp $ */ #include "sqliteInt.h" /* ** SQL is translated into a sequence of instructions to be ** executed by a virtual machine. Each instruction is an instance ** of the following structure. |
︙ | ︙ | |||
667 668 669 670 671 672 673 674 675 676 677 678 679 680 | int pc; /* The program counter */ Op *pOp; /* Current operation */ int rc; /* Value to return */ char zBuf[100]; /* Space to sprintf() and integer */ p->tos = -1; rc = SQLITE_OK; if( pzErrMsg ){ *pzErrMsg = 0; } for(pc=0; rc==SQLITE_OK && pc<p->nOp && pc>=0; pc++){ pOp = &p->aOp[pc]; if( p->trace ){ fprintf(p->trace,"%4d %-12s %4d %4d %s\n", pc, zOpName[pOp->opcode], pOp->p1, pOp->p2, pOp->p3 ? pOp->p3 : ""); | > > > > > | 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 | int pc; /* The program counter */ Op *pOp; /* Current operation */ int rc; /* Value to return */ char zBuf[100]; /* Space to sprintf() and integer */ p->tos = -1; rc = SQLITE_OK; #ifdef MEMORY_DEBUG if( access("vdbe_trace",0)==0 ){ p->trace = stderr; } #endif if( pzErrMsg ){ *pzErrMsg = 0; } for(pc=0; rc==SQLITE_OK && pc<p->nOp && pc>=0; pc++){ pOp = &p->aOp[pc]; if( p->trace ){ fprintf(p->trace,"%4d %-12s %4d %4d %s\n", pc, zOpName[pOp->opcode], pOp->p1, pOp->p2, pOp->p3 ? pOp->p3 : ""); |
︙ | ︙ | |||
1640 1641 1642 1643 1644 1645 1646 | case OP_Delete: { int tos = p->tos; int i = pOp->p1; if( tos<0 ) goto not_enough_stack; if( i>=0 && i<p->nTable && p->aTab[i].pTable!=0 ){ char *zKey; int nKey; | | > > > < < < | 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 | case OP_Delete: { int tos = p->tos; int i = pOp->p1; if( tos<0 ) goto not_enough_stack; if( i>=0 && i<p->nTable && p->aTab[i].pTable!=0 ){ char *zKey; int nKey; if( p->aStack[tos].flags & STK_Int ){ nKey = sizeof(int); zKey = (char*)&p->aStack[tos].i; }else{ if( Stringify(p, tos) ) goto no_mem; nKey = p->aStack[tos].n; zKey = p->zStack[tos]; } sqliteDbbeDelete(p->aTab[i].pTable, nKey, zKey); } PopStack(p, 1); break; } |
︙ | ︙ | |||
1967 1968 1969 1970 1971 1972 1973 | int i = pOp->p1; int val, amt; if( i<0 || i>=p->nList || p->apList[i]==0 ) goto bad_instruction; amt = fread(&val, sizeof(int), 1, p->apList[i]); if( amt==1 ){ p->tos++; if( NeedStack(p, p->tos) ) goto no_mem; | | > | 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 | int i = pOp->p1; int val, amt; if( i<0 || i>=p->nList || p->apList[i]==0 ) goto bad_instruction; amt = fread(&val, sizeof(int), 1, p->apList[i]); if( amt==1 ){ p->tos++; if( NeedStack(p, p->tos) ) goto no_mem; p->aStack[p->tos].i = val; p->aStack[p->tos].flags = STK_Int; p->zStack[p->tos] = 0; }else{ pc = pOp->p2 - 1; } break; } /* Opcode: ListClose P1 * * |
︙ | ︙ |
Changes to test/copy.test.
︙ | ︙ | |||
19 20 21 22 23 24 25 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the COPY statement. # | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # drh@hwaci.com # http://www.hwaci.com/drh/ # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing the COPY statement. # # $Id: copy.test,v 1.3 2000/06/05 02:07:05 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a file of data from which to copy. # set f [open data1.txt w] |
︙ | ︙ | |||
77 78 79 80 81 82 83 84 85 86 87 88 89 90 | # Make sure input terminates at \. # do_test copy-1.4 { execsql {DELETE FROM test1} execsql {COPY test1 FROM 'data2.txt'} execsql {SELECT * FROM test1 ORDER BY one} } {11 22 33} # Test out the USING DELIMITERS clause # do_test copy-1.5 { execsql {DELETE FROM test1} execsql {COPY test1 FROM 'data4.txt' USING DELIMITERS ' | '} execsql {SELECT * FROM test1 ORDER BY one} | > | 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | # Make sure input terminates at \. # do_test copy-1.4 { execsql {DELETE FROM test1} execsql {COPY test1 FROM 'data2.txt'} execsql {SELECT * FROM test1 ORDER BY one} } {11 22 33} return # Test out the USING DELIMITERS clause # do_test copy-1.5 { execsql {DELETE FROM test1} execsql {COPY test1 FROM 'data4.txt' USING DELIMITERS ' | '} execsql {SELECT * FROM test1 ORDER BY one} |
︙ | ︙ |