Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Merge recent trunk changes into the sessions branch. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | sessions |
Files: | files | file ages | folders |
SHA1: |
a769c7e03e6d4163986d49652687de34 |
User & Date: | drh 2014-05-26 20:00:00.506 |
Context
2014-05-29
| ||
20:29 | Merge trunk changes into the sessions branch. (check-in: 9f18e78f03 user: drh tags: sessions) | |
2014-05-26
| ||
20:00 | Merge recent trunk changes into the sessions branch. (check-in: a769c7e03e user: drh tags: sessions) | |
18:27 | Fix a problem in the shell when importing CSV files. If the leftmost field of the first row in the CSV file was both zero bytes in size and unquoted, no data was imported. (check-in: 856d44a206 user: dan tags: trunk) | |
2014-05-20
| ||
00:20 | Merge recent trunk changes into the sessions branch. (check-in: 2d33afe0c4 user: drh tags: sessions) | |
Changes
Changes to ext/fts3/fts3.c.
︙ | ︙ | |||
1372 1373 1374 1375 1376 1377 1378 | } /* Fill in the abNotindexed array */ for(iCol=0; iCol<nCol; iCol++){ int n = (int)strlen(p->azColumn[iCol]); for(i=0; i<nNotindexed; i++){ char *zNot = azNotindexed[i]; | > | > | 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 | } /* Fill in the abNotindexed array */ for(iCol=0; iCol<nCol; iCol++){ int n = (int)strlen(p->azColumn[iCol]); for(i=0; i<nNotindexed; i++){ char *zNot = azNotindexed[i]; if( zNot && strlen(zNot)==n && 0==sqlite3_strnicmp(p->azColumn[iCol], zNot, n) ){ p->abNotindexed[iCol] = 1; sqlite3_free(zNot); azNotindexed[i] = 0; } } } for(i=0; i<nNotindexed; i++){ |
︙ | ︙ |
Changes to src/btree.c.
︙ | ︙ | |||
8522 8523 8524 8525 8526 8527 8528 | ** set the mask of hint flags for cursor pCsr. Currently the only valid ** values are 0 and BTREE_BULKLOAD. */ void sqlite3BtreeCursorHints(BtCursor *pCsr, unsigned int mask){ assert( mask==BTREE_BULKLOAD || mask==0 ); pCsr->hints = mask; } | > > > > > > > | 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 | ** set the mask of hint flags for cursor pCsr. Currently the only valid ** values are 0 and BTREE_BULKLOAD. */ void sqlite3BtreeCursorHints(BtCursor *pCsr, unsigned int mask){ assert( mask==BTREE_BULKLOAD || mask==0 ); pCsr->hints = mask; } /* ** Return true if the given Btree is read-only. */ int sqlite3BtreeIsReadonly(Btree *p){ return (p->pBt->btsFlags & BTS_READ_ONLY)!=0; } |
Changes to src/btree.h.
︙ | ︙ | |||
190 191 192 193 194 195 196 197 198 199 200 201 202 203 | struct Pager *sqlite3BtreePager(Btree*); int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); void sqlite3BtreeIncrblobCursor(BtCursor *); void sqlite3BtreeClearCursor(BtCursor *); int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); void sqlite3BtreeCursorHints(BtCursor *, unsigned int mask); #ifndef NDEBUG int sqlite3BtreeCursorIsValid(BtCursor*); #endif #ifndef SQLITE_OMIT_BTREECOUNT int sqlite3BtreeCount(BtCursor *, i64 *); | > | 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | struct Pager *sqlite3BtreePager(Btree*); int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); void sqlite3BtreeIncrblobCursor(BtCursor *); void sqlite3BtreeClearCursor(BtCursor *); int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); void sqlite3BtreeCursorHints(BtCursor *, unsigned int mask); int sqlite3BtreeIsReadonly(Btree *pBt); #ifndef NDEBUG int sqlite3BtreeCursorIsValid(BtCursor*); #endif #ifndef SQLITE_OMIT_BTREECOUNT int sqlite3BtreeCount(BtCursor *, i64 *); |
︙ | ︙ |
Changes to src/build.c.
︙ | ︙ | |||
1302 1303 1304 1305 1306 1307 1308 | */ void sqlite3AddCheckConstraint( Parse *pParse, /* Parsing context */ Expr *pCheckExpr /* The check expression */ ){ #ifndef SQLITE_OMIT_CHECK Table *pTab = pParse->pNewTable; | > | > > | 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 | */ void sqlite3AddCheckConstraint( Parse *pParse, /* Parsing context */ Expr *pCheckExpr /* The check expression */ ){ #ifndef SQLITE_OMIT_CHECK Table *pTab = pParse->pNewTable; sqlite3 *db = pParse->db; if( pTab && !IN_DECLARE_VTAB && !sqlite3BtreeIsReadonly(db->aDb[db->init.iDb].pBt) ){ pTab->pCheck = sqlite3ExprListAppend(pParse, pTab->pCheck, pCheckExpr); if( pParse->constraintName.n ){ sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1); } }else #endif { |
︙ | ︙ |
Changes to src/insert.c.
︙ | ︙ | |||
610 611 612 613 614 615 616 617 618 619 620 621 622 623 | } break; } } if( j>=pTab->nCol ){ if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){ ipkColumn = i; }else{ sqlite3ErrorMsg(pParse, "table %S has no column named %s", pTabList, 0, pColumn->a[i].zName); pParse->checkSchema = 1; goto insert_cleanup; } } | > | 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 | } break; } } if( j>=pTab->nCol ){ if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){ ipkColumn = i; bIdListInOrder = 0; }else{ sqlite3ErrorMsg(pParse, "table %S has no column named %s", pTabList, 0, pColumn->a[i].zName); pParse->checkSchema = 1; goto insert_cleanup; } } |
︙ | ︙ |
Changes to src/main.c.
︙ | ︙ | |||
3462 3463 3464 3465 3466 3467 3468 | /* ** Return 1 if database is read-only or 0 if read/write. Return -1 if ** no such database exists. */ int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ Btree *pBt = sqlite3DbNameToBtree(db, zDbName); | | | 3462 3463 3464 3465 3466 3467 3468 3469 3470 | /* ** Return 1 if database is read-only or 0 if read/write. Return -1 if ** no such database exists. */ int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ Btree *pBt = sqlite3DbNameToBtree(db, zDbName); return pBt ? sqlite3BtreeIsReadonly(pBt) : -1; } |
Changes to src/select.c.
︙ | ︙ | |||
4494 4495 4496 4497 4498 4499 4500 4501 | #ifndef SQLITE_OMIT_EXPLAIN static void explainSimpleCount( Parse *pParse, /* Parse context */ Table *pTab, /* Table being queried */ Index *pIdx /* Index used to optimize scan, or NULL */ ){ if( pParse->explain==2 ){ char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s%s%s", | > | | | | 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 | #ifndef SQLITE_OMIT_EXPLAIN static void explainSimpleCount( Parse *pParse, /* Parse context */ Table *pTab, /* Table being queried */ Index *pIdx /* Index used to optimize scan, or NULL */ ){ if( pParse->explain==2 ){ int bCover = (pIdx!=0 && (HasRowid(pTab) || pIdx->autoIndex!=2)); char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s%s%s", pTab->zName, bCover ? " USING COVERING INDEX " : "", bCover ? pIdx->zName : "" ); sqlite3VdbeAddOp4( pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC ); } } #else |
︙ | ︙ |
Changes to src/shell.c.
︙ | ︙ | |||
693 694 695 696 697 698 699 | #ifdef SIGINT /* ** This routine runs when the user presses Ctrl-C */ static void interrupt_handler(int NotUsed){ UNUSED_PARAMETER(NotUsed); | | > | 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 | #ifdef SIGINT /* ** This routine runs when the user presses Ctrl-C */ static void interrupt_handler(int NotUsed){ UNUSED_PARAMETER(NotUsed); seenInterrupt++; if( seenInterrupt>2 ) exit(1); if( db ) sqlite3_interrupt(db); } #endif /* ** This is the callback routine that the shell ** invokes for each row of a query result. |
︙ | ︙ | |||
2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 | if( zSql==0 ){ fprintf(stderr, "Error: out of memory\n"); xCloser(sCsv.in); return 1; } nByte = strlen30(zSql); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){ char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); char cSep = '('; while( csv_read_one_field(&sCsv) ){ zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z); cSep = ','; if( sCsv.cTerm!=sCsv.cSeparator ) break; | > | 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 | if( zSql==0 ){ fprintf(stderr, "Error: out of memory\n"); xCloser(sCsv.in); return 1; } nByte = strlen30(zSql); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); csv_append_char(&sCsv, 0); /* To ensure sCsv.z is allocated */ if( rc && sqlite3_strglob("no such table: *", sqlite3_errmsg(db))==0 ){ char *zCreate = sqlite3_mprintf("CREATE TABLE %s", zTable); char cSep = '('; while( csv_read_one_field(&sCsv) ){ zCreate = sqlite3_mprintf("%z%c\n \"%s\" TEXT", zCreate, cSep, sCsv.z); cSep = ','; if( sCsv.cTerm!=sCsv.cSeparator ) break; |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
3470 3471 3472 3473 3474 3475 3476 | ** to an SQL index, then P3 is the first in an array of P4 registers ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the smallest entry that ** is greater than or equal to the key value. If there are no records ** greater than or equal to the key and P2 is not zero, then jump to P2. ** | | | | | | 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 | ** to an SQL index, then P3 is the first in an array of P4 registers ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the smallest entry that ** is greater than or equal to the key value. If there are no records ** greater than or equal to the key and P2 is not zero, then jump to P2. ** ** See also: Found, NotFound, SeekLt, SeekGt, SeekLe */ /* Opcode: SeekGt P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), ** use the value in register P3 as a key. If cursor P1 refers ** to an SQL index, then P3 is the first in an array of P4 registers ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the smallest entry that ** is greater than the key value. If there are no records greater than ** the key and P2 is not zero, then jump to P2. ** ** See also: Found, NotFound, SeekLt, SeekGe, SeekLe */ /* Opcode: SeekLt P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), ** use the value in register P3 as a key. If cursor P1 refers ** to an SQL index, then P3 is the first in an array of P4 registers ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the largest entry that ** is less than the key value. If there are no records less than ** the key and P2 is not zero, then jump to P2. ** ** See also: Found, NotFound, SeekGt, SeekGe, SeekLe */ /* Opcode: SeekLe P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys), ** use the value in register P3 as a key. If cursor P1 refers ** to an SQL index, then P3 is the first in an array of P4 registers ** that are used as an unpacked index key. ** ** Reposition cursor P1 so that it points to the largest entry that ** is less than or equal to the key value. If there are no records ** less than or equal to the key and P2 is not zero, then jump to P2. ** ** See also: Found, NotFound, SeekGt, SeekGe, SeekLt */ case OP_SeekLT: /* jump, in3 */ case OP_SeekLE: /* jump, in3 */ case OP_SeekGE: /* jump, in3 */ case OP_SeekGT: { /* jump, in3 */ int res; int oc; |
︙ | ︙ |
Changes to src/where.c.
︙ | ︙ | |||
2714 2715 2716 2717 2718 2719 2720 2721 | if( pItem->zAlias ){ zMsg = sqlite3MAppendf(db, zMsg, "%s AS %s", zMsg, pItem->zAlias); } if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 && ALWAYS(pLoop->u.btree.pIndex!=0) ){ char *zWhere = explainIndexRange(db, pLoop, pItem->pTab); | > > < > > > | | < | > > > > | | 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 | if( pItem->zAlias ){ zMsg = sqlite3MAppendf(db, zMsg, "%s AS %s", zMsg, pItem->zAlias); } if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 && ALWAYS(pLoop->u.btree.pIndex!=0) ){ const char *zFmt; Index *pIdx = pLoop->u.btree.pIndex; char *zWhere = explainIndexRange(db, pLoop, pItem->pTab); assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); if( !HasRowid(pItem->pTab) && pIdx->autoIndex==2 ){ zFmt = zWhere ? "%s USING PRIMARY KEY%.0s%s" : "%s%.0s%s"; }else if( flags & WHERE_AUTO_INDEX ){ zFmt = "%s USING AUTOMATIC COVERING INDEX%.0s%s"; }else if( flags & WHERE_IDX_ONLY ){ zFmt = "%s USING COVERING INDEX %s%s"; }else{ zFmt = "%s USING INDEX %s%s"; } zMsg = sqlite3MAppendf(db, zMsg, zFmt, zMsg, pIdx->zName, zWhere); sqlite3DbFree(db, zWhere); }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ zMsg = sqlite3MAppendf(db, zMsg, "%s USING INTEGER PRIMARY KEY", zMsg); if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ zMsg = sqlite3MAppendf(db, zMsg, "%s (rowid=?)", zMsg); }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ |
︙ | ︙ |
Changes to test/eqp.test.
︙ | ︙ | |||
593 594 595 596 597 598 599 600 601 602 | det 7.4 "SELECT count(*) FROM t1" { 0 0 0 {SCAN TABLE t1} } det 7.5 "SELECT count(*) FROM t2" { 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1} } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 | det 7.4 "SELECT count(*) FROM t1" { 0 0 0 {SCAN TABLE t1} } det 7.5 "SELECT count(*) FROM t2" { 0 0 0 {SCAN TABLE t2 USING COVERING INDEX i1} } #------------------------------------------------------------------------- # The following tests - eqp-8.* - test that queries that use the OP_Count # optimization return something sensible with EQP. # drop_all_tables do_execsql_test 8.0 { CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)) WITHOUT ROWID; CREATE TABLE t2(a, b, c); } det 8.1.1 "SELECT * FROM t2" { 0 0 0 {SCAN TABLE t2} } det 8.1.2 "SELECT * FROM t2 WHERE rowid=?" { 0 0 0 {SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)} } det 8.1.3 "SELECT count(*) FROM t2" { 0 0 0 {SCAN TABLE t2} } det 8.2.1 "SELECT * FROM t1" { 0 0 0 {SCAN TABLE t1} } det 8.2.2 "SELECT * FROM t1 WHERE b=?" { 0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=?)} } det 8.2.3 "SELECT * FROM t1 WHERE b=? AND c=?" { 0 0 0 {SEARCH TABLE t1 USING PRIMARY KEY (b=? AND c=?)} } det 8.2.4 "SELECT count(*) FROM t1" { 0 0 0 {SCAN TABLE t1} } finish_test |
Changes to test/fts4noti.test.
︙ | ︙ | |||
160 161 162 163 164 165 166 167 168 169 170 171 | INSERT INTO t2 VALUES('b', 'c', 'a'); } do_execsql_test 5.2 { SELECT docid FROM t2 WHERE t2 MATCH 'a' } {2} do_execsql_test 5.3 { SELECT docid FROM t2 WHERE t2 MATCH 'b' } {1} do_execsql_test 5.4 { SELECT docid FROM t2 WHERE t2 MATCH 'c' } {3} do_execsql_test 5.x { DROP TABLE t2 } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | INSERT INTO t2 VALUES('b', 'c', 'a'); } do_execsql_test 5.2 { SELECT docid FROM t2 WHERE t2 MATCH 'a' } {2} do_execsql_test 5.3 { SELECT docid FROM t2 WHERE t2 MATCH 'b' } {1} do_execsql_test 5.4 { SELECT docid FROM t2 WHERE t2 MATCH 'c' } {3} do_execsql_test 5.x { DROP TABLE t2 } #------------------------------------------------------------------------- # Check that if an indexed column name is a prefix of a notindexed column # name, the column is still correctly tokenized. This was a problem at one # point. do_execsql_test 6.1.1 { CREATE VIRTUAL TABLE t1 USING fts4( poiCategory, poiCategoryId, notindexed=poiCategoryId ); INSERT INTO t1(poiCategory, poiCategoryId) values ("Restaurant", 6021); } do_execsql_test 6.1.2 { SELECT * FROM t1 WHERE t1 MATCH 'restaurant'; } { Restaurant 6021 } do_execsql_test 6.1.3 { SELECT * FROM t1 WHERE t1 MATCH 're*'; } { Restaurant 6021 } do_execsql_test 6.1.4 { SELECT * FROM t1 WHERE t1 MATCH '6021'; } {} do_execsql_test 6.1.5 { SELECT * FROM t1 WHERE t1 MATCH '60*'; } {} do_execsql_test 6.2.1 { DROP TABLE t1; CREATE VIRTUAL TABLE t1 USING fts4( poiCategory, poiCategoryId, notindexed=poiCategory ); INSERT INTO t1(poiCategory, poiCategoryId) values ("Restaurant", 6021); } do_execsql_test 6.2.2 { SELECT * FROM t1 WHERE t1 MATCH 'restaurant'; } {} do_execsql_test 6.2.3 { SELECT * FROM t1 WHERE t1 MATCH 're*'; } {} do_execsql_test 6.2.4 { SELECT * FROM t1 WHERE t1 MATCH '6021'; } { Restaurant 6021 } do_execsql_test 6.2.5 { SELECT * FROM t1 WHERE t1 MATCH '60*'; } { Restaurant 6021 } finish_test |
Changes to test/insert.test.
︙ | ︙ | |||
408 409 410 411 412 413 414 415 416 417 418 | do_execsql_test insert-11.1 { CREATE TABLE t11a AS SELECT '123456789' AS x; CREATE TABLE t11b (a INTEGER PRIMARY KEY, b, c); INSERT INTO t11b SELECT x, x, x FROM t11a; SELECT quote(a), quote(b), quote(c) FROM t11b; } {123456789 '123456789' '123456789'} integrity_check insert-99.0 finish_test | > > > > > > > > > > > > > > > > > > > > > > > | 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 | do_execsql_test insert-11.1 { CREATE TABLE t11a AS SELECT '123456789' AS x; CREATE TABLE t11b (a INTEGER PRIMARY KEY, b, c); INSERT INTO t11b SELECT x, x, x FROM t11a; SELECT quote(a), quote(b), quote(c) FROM t11b; } {123456789 '123456789' '123456789'} # More columns of input than there are columns in the table. # Ticket http://www.sqlite.org/src/info/e9654505cfda9361 # do_execsql_test insert-12.1 { CREATE TABLE t12a(a,b,c,d,e,f,g); INSERT INTO t12a VALUES(101,102,103,104,105,106,107); CREATE TABLE t12b(x); INSERT INTO t12b(x,rowid,x,x,x,x,x) SELECT * FROM t12a; SELECT rowid, x FROM t12b; } {102 101} do_execsql_test insert-12.2 { CREATE TABLE tab1( value INTEGER); INSERT INTO tab1 (value, _rowid_) values( 11, 1); INSERT INTO tab1 (value, _rowid_) SELECT 22,999; SELECT * FROM tab1; } {11 22} do_execsql_test insert-12.3 { CREATE TABLE t12c(a, b DEFAULT 'xyzzy', c); INSERT INTO t12c(a, rowid, c) SELECT 'one', 999, 'two'; SELECT * FROM t12c; } {one xyzzy two} integrity_check insert-99.0 finish_test |
Changes to test/rdonly.test.
︙ | ︙ | |||
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 | do_test rdonly-1.1 { execsql { CREATE TABLE t1(x); INSERT INTO t1 VALUES(1); SELECT * FROM t1; } } {1} # Changes the write version from 1 to 3. Verify that the database # can be read but not written. # do_test rdonly-1.2 { db close hexio_get_int [hexio_read test.db 18 1] } 1 do_test rdonly-1.3 { hexio_write test.db 18 03 sqlite3 db test.db execsql { SELECT * FROM t1; } } {1} do_test rdonly-1.4 { catchsql { INSERT INTO t1 VALUES(2) } } {1 {attempt to write a readonly database}} # Change the write version back to 1. Verify that the database | > > > > > > | 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 57 58 59 60 61 62 | do_test rdonly-1.1 { execsql { CREATE TABLE t1(x); INSERT INTO t1 VALUES(1); SELECT * FROM t1; } } {1} do_test rdonly-1.1.1 { sqlite3_db_readonly db main } {0} # Changes the write version from 1 to 3. Verify that the database # can be read but not written. # do_test rdonly-1.2 { db close hexio_get_int [hexio_read test.db 18 1] } 1 do_test rdonly-1.3 { hexio_write test.db 18 03 sqlite3 db test.db execsql { SELECT * FROM t1; } } {1} do_test rdonly-1.3.1 { sqlite3_db_readonly db main } {1} do_test rdonly-1.4 { catchsql { INSERT INTO t1 VALUES(2) } } {1 {attempt to write a readonly database}} # Change the write version back to 1. Verify that the database |
︙ | ︙ |
Changes to test/shell5.test.
︙ | ︙ | |||
298 299 300 301 302 303 304 305 | forcedelete test.db catchcmd test.db {.mode csv .import shell5.csv t1 } sqlite3 db test.db db eval {SELECT *, '|' FROM t1} } {a b { } | x y {} | p q r |} | > > | > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 | forcedelete test.db catchcmd test.db {.mode csv .import shell5.csv t1 } sqlite3 db test.db db eval {SELECT *, '|' FROM t1} } {a b { } | x y {} | p q r |} db close #---------------------------------------------------------------------------- # reset_db sqlite3 db test.db do_test shell5-2.1 { set fd [open shell5.csv w] puts $fd ",hello" close $fd catchcmd test.db [string trim { .mode csv CREATE TABLE t1(a, b); .import shell5.csv t1 }] db eval { SELECT * FROM t1 } } {{} hello} do_test shell5-2.2 { set fd [open shell5.csv w] puts $fd {"",hello} close $fd catchcmd test.db [string trim { .mode csv CREATE TABLE t2(a, b); .import shell5.csv t2 }] db eval { SELECT * FROM t2 } } {{} hello} do_test shell5-2.3 { set fd [open shell5.csv w] puts $fd {"x""y",hello} close $fd catchcmd test.db [string trim { .mode csv CREATE TABLE t3(a, b); .import shell5.csv t3 }] db eval { SELECT * FROM t3 } } {x\"y hello} do_test shell5-2.4 { set fd [open shell5.csv w] puts $fd {"xy""",hello} close $fd catchcmd test.db [string trim { .mode csv CREATE TABLE t4(a, b); .import shell5.csv t4 }] db eval { SELECT * FROM t4 } } {xy\" hello} finish_test |
Changes to test/skipscan1.test.
︙ | ︙ | |||
177 178 179 180 181 182 183 | do_execsql_test skipscan1-3.2 { SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; } {abc 345 7 8 | def 345 9 10 |} do_execsql_test skipscan1-3.2eqp { EXPLAIN QUERY PLAN SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; | | | 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | do_execsql_test skipscan1-3.2 { SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; } {abc 345 7 8 | def 345 9 10 |} do_execsql_test skipscan1-3.2eqp { EXPLAIN QUERY PLAN SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; } {/* PRIMARY KEY (ANY(a) AND b=?)*/} do_execsql_test skipscan1-3.2sort { EXPLAIN QUERY PLAN SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; } {~/*ORDER BY*/} # Ticket 520070ec7fbaac: Array overrun in the skip-scan optimization # 2013-12-22 |
︙ | ︙ |
Changes to test/skipscan2.test.
︙ | ︙ | |||
182 183 184 185 186 187 188 189 190 191 | SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; } {David Jack Patrick Quiana Xavier} do_execsql_test skipscan2-2.5eqp { EXPLAIN QUERY PLAN SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; } {/*INDEX peoplew_idx1 */} finish_test | > > > > > > > > > > > > > > | 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; } {David Jack Patrick Quiana Xavier} do_execsql_test skipscan2-2.5eqp { EXPLAIN QUERY PLAN SELECT name FROM peoplew WHERE height>=180 ORDER BY +name; } {/*INDEX peoplew_idx1 */} # A skip-scan on a PK index of a WITHOUT ROWID table. # do_execsql_test skipscan2-3.1 { CREATE TABLE t3(a, b, c, PRIMARY KEY(a, b)) WITHOUT ROWID; } do_test skipscan2-3.2 { for {set i 0} {$i < 1000} {incr i} { execsql { INSERT INTO t3 VALUES($i%2, $i, 'xyz') } } execsql { ANALYZE } } {} do_eqp_test skipscan2-3.3eqp { SELECT * FROM t3 WHERE b=42; } {0 0 0 {SEARCH TABLE t3 USING PRIMARY KEY (ANY(a) AND b=?)}} finish_test |