Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Merge latest trunk changes with this branch. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | shared-cache-fixes |
Files: | files | file ages | folders |
SHA1: |
47dd65a890955f333d431e275f3f4d95 |
User & Date: | dan 2013-05-15 15:42:14.167 |
Context
2013-05-15
| ||
15:53 | Do not run sharedA.test if the system is not threadsafe. (check-in: d484eaf8d6 user: dan tags: shared-cache-fixes) | |
15:42 | Merge latest trunk changes with this branch. (check-in: 47dd65a890 user: dan tags: shared-cache-fixes) | |
15:16 | When loading a database schema that contains an index definition that includes a COLLATE clause for which the collation sequence is unavailable, do not assume that that index uses BINARY instead. Fix for [0fc59f908b]. (check-in: 6dae62c4e5 user: dan tags: trunk) | |
10:21 | When closing a connection, avoid tripping active cursors belonging to a different shared-cache client. Also, if sqlite3_close() is called while there are still active statements belonging to the connection, return SQLITE_BUSY and do not roll back any active transaction. Proposed fix for ticket [e636a050b709]. (check-in: 6071b7cce0 user: dan tags: shared-cache-fixes) | |
Changes
Added ext/misc/rot13.c.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | /* ** 2013-05-15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ****************************************************************************** ** ** This SQLite extension implements a rot13() function and a rot13 ** collating sequence. */ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 #include <assert.h> #include <string.h> /* ** Perform rot13 encoding on a single ASCII character. */ static unsigned char rot13(unsigned char c){ if( c>='a' && c<='z' ){ c += 13; if( c>'z' ) c -= 26; }else if( c>='A' && c<='Z' ){ c += 13; if( c>'Z' ) c -= 26; } return c; } /* ** Implementation of the rot13() function. ** ** Rotate ASCII alphabetic characters by 13 character positions. ** Non-ASCII characters are unchanged. rot13(rot13(X)) should always ** equal X. */ static void rot13func( sqlite3_context *context, int argc, sqlite3_value **argv ){ const unsigned char *zIn; int nIn; unsigned char *zOut; char *zToFree = 0; int i; char zTemp[100]; assert( argc==1 ); if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; zIn = (const unsigned char*)sqlite3_value_text(argv[0]); nIn = sqlite3_value_bytes(argv[0]); if( nIn<sizeof(zTemp)-1 ){ zOut = zTemp; }else{ zOut = zToFree = sqlite3_malloc( nIn+1 ); if( zOut==0 ){ sqlite3_result_error_nomem(context); return; } } for(i=0; i<nIn; i++) zOut[i] = rot13(zIn[i]); zOut[i] = 0; sqlite3_result_text(context, (char*)zOut, i, SQLITE_TRANSIENT); sqlite3_free(zToFree); } /* ** Implement the rot13 collating sequence so that if ** ** x=y COLLATE rot13 ** ** Then ** ** rot13(x)=rot13(y) COLLATE binary */ static int rot13CollFunc( void *notUsed, int nKey1, const void *pKey1, int nKey2, const void *pKey2 ){ const char *zA = (const char*)pKey1; const char *zB = (const char*)pKey2; int i, x; for(i=0; i<nKey1 && i<nKey2; i++){ x = (int)rot13(zA[i]) - (int)rot13(zB[i]); if( x!=0 ) return x; } return nKey1 - nKey2; } #ifdef _WIN32 __declspec(dllexport) #endif int sqlite3_rot_init( sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi ){ int rc = SQLITE_OK; SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ rc = sqlite3_create_function(db, "rot13", 1, SQLITE_UTF8, 0, rot13func, 0, 0); if( rc==SQLITE_OK ){ rc = sqlite3_create_collation(db, "rot13", SQLITE_UTF8, 0, rot13CollFunc); } return rc; } |
Changes to src/build.c.
︙ | ︙ | |||
2655 2656 2657 2658 2659 2660 2661 | /* Figure out how many bytes of space are required to store explicitly ** specified collation sequence names. */ for(i=0; i<pList->nExpr; i++){ Expr *pExpr = pList->a[i].pExpr; if( pExpr ){ | | < | < | 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 | /* Figure out how many bytes of space are required to store explicitly ** specified collation sequence names. */ for(i=0; i<pList->nExpr; i++){ Expr *pExpr = pList->a[i].pExpr; if( pExpr ){ assert( pExpr->op==TK_COLLATE ); nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); } } /* ** Allocate the index structure. */ nName = sqlite3Strlen30(zName); |
︙ | ︙ | |||
2719 2720 2721 2722 2723 2724 2725 | ** same column more than once cannot be an error because that would ** break backwards compatibility - it needs to be a warning. */ for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){ const char *zColName = pListItem->zName; Column *pTabCol; int requestedSortOrder; | < | < < > | | < < | 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 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 | ** same column more than once cannot be an error because that would ** break backwards compatibility - it needs to be a warning. */ for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){ const char *zColName = pListItem->zName; Column *pTabCol; int requestedSortOrder; char *zColl; /* Collation sequence name */ for(j=0, pTabCol=pTab->aCol; j<pTab->nCol; j++, pTabCol++){ if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break; } if( j>=pTab->nCol ){ sqlite3ErrorMsg(pParse, "table %s has no column named %s", pTab->zName, zColName); pParse->checkSchema = 1; goto exit_create_index; } pIndex->aiColumn[i] = j; if( pListItem->pExpr ){ int nColl; assert( pListItem->pExpr->op==TK_COLLATE ); zColl = pListItem->pExpr->u.zToken; nColl = sqlite3Strlen30(zColl) + 1; assert( nExtra>=nColl ); memcpy(zExtra, zColl, nColl); zColl = zExtra; zExtra += nColl; nExtra -= nColl; }else{ zColl = pTab->aCol[j].zColl; if( !zColl ) zColl = "BINARY"; } if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ goto exit_create_index; } pIndex->azColl[i] = zColl; requestedSortOrder = pListItem->sortOrder & sortOrderMask; pIndex->aSortOrder[i] = (u8)requestedSortOrder; |
︙ | ︙ |
Changes to test/collate3.test.
︙ | ︙ | |||
50 51 52 53 54 55 56 57 58 59 60 61 62 63 | CREATE INDEX collate3i1 ON collate3t1(c1 COLLATE garbage); } } {1 {no such collation sequence: garbage}} execsql { DROP TABLE collate3t1; } # # Create a table with a default collation sequence, then close # and re-open the database without re-registering the collation # sequence. Then make sure the library stops us from using # the collation sequence in: # * an explicitly collated ORDER BY | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | CREATE INDEX collate3i1 ON collate3t1(c1 COLLATE garbage); } } {1 {no such collation sequence: garbage}} execsql { DROP TABLE collate3t1; } proc caseless {a b} { string compare -nocase $a $b } do_test collate3-1.4 { db collate caseless caseless execsql { CREATE TABLE t1(a COLLATE caseless); INSERT INTO t1 VALUES('Abc2'); INSERT INTO t1 VALUES('abc1'); INSERT INTO t1 VALUES('aBc3'); } execsql { SELECT * FROM t1 ORDER BY a } } {abc1 Abc2 aBc3} do_test collate3-1.5 { db close sqlite3 db test.db catchsql { SELECT * FROM t1 ORDER BY a } } {1 {no such collation sequence: caseless}} do_test collate3-1.6.1 { db collate caseless caseless execsql { CREATE INDEX i1 ON t1(a) } execsql { SELECT * FROM t1 ORDER BY a } } {abc1 Abc2 aBc3} do_test collate3-1.6.2 { db close sqlite3 db test.db catchsql { SELECT * FROM t1 ORDER BY a } } {1 {no such collation sequence: caseless}} do_test collate3-1.6.3 { db close sqlite3 db test.db catchsql { PRAGMA integrity_check } } {1 {no such collation sequence: caseless}} do_test collate3-1.6.4 { db close sqlite3 db test.db catchsql { REINDEX } } {1 {no such collation sequence: caseless}} do_test collate3-1.7.1 { db collate caseless caseless execsql { DROP TABLE t1; CREATE TABLE t1(a); CREATE INDEX i1 ON t1(a COLLATE caseless); INSERT INTO t1 VALUES('Abc2'); INSERT INTO t1 VALUES('abc1'); INSERT INTO t1 VALUES('aBc3'); SELECT * FROM t1 ORDER BY a COLLATE caseless; } } {abc1 Abc2 aBc3} do_test collate3-1.7.2 { db close sqlite3 db test.db catchsql { SELECT * FROM t1 ORDER BY a COLLATE caseless} } {1 {no such collation sequence: caseless}} do_test collate3-1.7.4 { db close sqlite3 db test.db catchsql { REINDEX } } {1 {no such collation sequence: caseless}} do_test collate3-1.7.3 { db close sqlite3 db test.db catchsql { PRAGMA integrity_check } } {1 {no such collation sequence: caseless}} do_test collate3-1.7.4 { db close sqlite3 db test.db catchsql { REINDEX } } {1 {no such collation sequence: caseless}} do_test collate3-1.7.5 { db close sqlite3 db test.db db collate caseless caseless catchsql { PRAGMA integrity_check } } {0 ok} do_test collate3-1.7.6 { execsql { DROP TABLE t1 } } {} # # Create a table with a default collation sequence, then close # and re-open the database without re-registering the collation # sequence. Then make sure the library stops us from using # the collation sequence in: # * an explicitly collated ORDER BY |
︙ | ︙ |