Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Bug fix: CREATE TABLE, followed by DROP TABLE within the same transaction is working now. (CVS 378) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
553579f936b3a4477c6adfd991adccd0 |
User & Date: | drh 2002-02-18 22:49:59.000 |
Context
2002-02-18
| ||
22:50 | Added a C wrapper program to test threading under Unix. (CVS 379) (check-in: 8d5634a447 user: drh tags: trunk) | |
22:49 | Bug fix: CREATE TABLE, followed by DROP TABLE within the same transaction is working now. (CVS 378) (check-in: 553579f936 user: drh tags: trunk) | |
18:30 | Add support for CREATE TABLE AS. (CVS 377) (check-in: 78a50971e9 user: drh tags: trunk) | |
Changes
Changes to src/build.c.
︙ | ︙ | |||
21 22 23 24 25 26 27 | ** COPY ** VACUUM ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK ** PRAGMA ** | | | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | ** COPY ** VACUUM ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK ** PRAGMA ** ** $Id: build.c,v 1.76 2002/02/18 22:49:59 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> /* ** This routine is called after a single SQL statement has been ** parsed and we want to execute the VDBE code to implement |
︙ | ︙ | |||
895 896 897 898 899 900 901 | { OP_SetCookie, 0, 0, 0}, /* 9 */ { OP_Close, 0, 0, 0}, }; Index *pIdx; sqliteBeginWriteOperation(pParse); if( !pTable->isTemp ){ base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable); | | | 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 | { OP_SetCookie, 0, 0, 0}, /* 9 */ { OP_Close, 0, 0, 0}, }; Index *pIdx; sqliteBeginWriteOperation(pParse); if( !pTable->isTemp ){ base = sqliteVdbeAddOpList(v, ArraySize(dropTable), dropTable); sqliteVdbeChangeP3(v, base+2, pTable->zName, 0); changeCookie(db); sqliteVdbeChangeP1(v, base+9, db->next_cookie); } sqliteVdbeAddOp(v, OP_Destroy, pTable->tnum, pTable->isTemp); for(pIdx=pTable->pIndex; pIdx; pIdx=pIdx->pNext){ sqliteVdbeAddOp(v, OP_Destroy, pIdx->tnum, pTable->isTemp); } |
︙ | ︙ |
Changes to src/parse.y.
︙ | ︙ | |||
10 11 12 13 14 15 16 | ** ************************************************************************* ** This file contains SQLite's grammar for SQL. Process this file ** using the lemon parser generator to generate C code that runs ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ** ************************************************************************* ** This file contains SQLite's grammar for SQL. Process this file ** using the lemon parser generator to generate C code that runs ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** ** @(#) $Id: parse.y,v 1.52 2002/02/18 22:49:59 drh Exp $ */ %token_prefix TK_ %token_type {Token} %default_type {Token} %extra_argument {Parse *pParse} %syntax_error { sqliteSetString(&pParse->zErrMsg,"syntax error",0); |
︙ | ︙ | |||
199 200 201 202 203 204 205 | %type select {Select*} %destructor select {sqliteSelectDelete($$);} %type oneselect {Select*} %destructor oneselect {sqliteSelectDelete($$);} select(A) ::= oneselect(X). {A = X;} | | | | | | | | 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 | %type select {Select*} %destructor select {sqliteSelectDelete($$);} %type oneselect {Select*} %destructor oneselect {sqliteSelectDelete($$);} select(A) ::= oneselect(X). {A = X;} select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { if( Z ){ Z->op = Y; Z->pPrior = X; } A = Z; } %type multiselect_op {int} multiselect_op(A) ::= UNION. {A = TK_UNION;} multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} multiselect_op(A) ::= INTERSECT. {A = TK_INTERSECT;} multiselect_op(A) ::= EXCEPT. {A = TK_EXCEPT;} oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.a,L.b); } // The "distinct" nonterminal is true (1) if the DISTINCT keyword is // present and false (0) if it is not. |
︙ | ︙ |
Changes to src/where.c.
︙ | ︙ | |||
9 10 11 12 13 14 15 | ** May you share freely, never taking more than you give. ** ************************************************************************* ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. Also found here are subroutines ** to generate VDBE code to evaluate expressions. ** | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ** May you share freely, never taking more than you give. ** ************************************************************************* ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. Also found here are subroutines ** to generate VDBE code to evaluate expressions. ** ** $Id: where.c,v 1.36 2002/02/18 22:49:59 drh Exp $ */ #include "sqliteInt.h" /* ** The query generator uses an array of instances of this structure to ** help it analyze the subexpressions of the WHERE clause. Each WHERE ** clause subexpression is separated from the others by an AND operator. |
︙ | ︙ | |||
224 225 226 227 228 229 230 | ** loop where i==0 is the outer loop and i==pTabList->nId-1 is the inner ** loop. ** ** If terms exist that use the ROWID of any table, then set the ** iDirectEq[], iDirectLt[], or iDirectGt[] elements for that table ** to the index of the term containing the ROWID. We always prefer ** to use a ROWID which can directly access a table rather than an | | > | > | 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 | ** loop where i==0 is the outer loop and i==pTabList->nId-1 is the inner ** loop. ** ** If terms exist that use the ROWID of any table, then set the ** iDirectEq[], iDirectLt[], or iDirectGt[] elements for that table ** to the index of the term containing the ROWID. We always prefer ** to use a ROWID which can directly access a table rather than an ** index which requires reading an index first to get the rowid then ** doing a second read of the actual database table. ** ** Actually, if there are more than 32 tables in the join, only the ** first 32 tables are candidates for indices. This is (again) due ** to the limit of 32 bits in an integer bitmask. */ loopMask = 0; for(i=0; i<pTabList->nId && i<ARRAYSIZE(aDirect); i++){ int j; int idx = aOrder[i]; Table *pTab = pTabList->a[idx].pTab; Index *pIdx; |
︙ | ︙ |
Changes to www/changes.tcl.
︙ | ︙ | |||
22 23 24 25 26 27 28 29 30 31 32 33 34 35 | with MS-Access.</li> <li>Added support for sub-queries in the FROM clause of a SELECT.</li> <li>More efficient implementation of sqliteFileExists() under Windows. (by Joel Luscy)</li> <li>The VALUES clause of an INSERT can now contain expressions, including scalar SELECT clauses.</li> <li>Added support for CREATE TABLE AS SELECT</li> } chng {2002 Feb 14 (2.3.2)} { <li>Bug fix: There was an incorrect assert() in pager.c. The real code was all correct (as far as is known) so everything should work OK if you compile with -DNDEBUG=1. But without disability the assertions, there could be a fault.</li> | > > | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | with MS-Access.</li> <li>Added support for sub-queries in the FROM clause of a SELECT.</li> <li>More efficient implementation of sqliteFileExists() under Windows. (by Joel Luscy)</li> <li>The VALUES clause of an INSERT can now contain expressions, including scalar SELECT clauses.</li> <li>Added support for CREATE TABLE AS SELECT</li> <li>Bug fix: Creating and dropping a table all within a single transaction was not working.</li> } chng {2002 Feb 14 (2.3.2)} { <li>Bug fix: There was an incorrect assert() in pager.c. The real code was all correct (as far as is known) so everything should work OK if you compile with -DNDEBUG=1. But without disability the assertions, there could be a fault.</li> |
︙ | ︙ |