diff options
author | drh <drh@noemail.net> | 2020-03-05 16:13:24 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2020-03-05 16:13:24 +0000 |
commit | 42a630b1daf1df13850095251cc73be84dbdeac8 (patch) | |
tree | cc6212d1cf798a2e3d8d8ce7d98c016a7056519c /src/callback.c | |
parent | 4cf2121e1c0adfcae41d89426e1e5e81ca4721a9 (diff) | |
download | sqlite-42a630b1daf1df13850095251cc73be84dbdeac8.tar.gz sqlite-42a630b1daf1df13850095251cc73be84dbdeac8.zip |
Change the sqlite3.pDfltColl (the default collating sequence for the
database connection) so that it is the collating sequence appropriate for
the database encoding, not the UTF8 collating sequence. This helps to
ensure that the database encoding collation is always used, even for
expressions that do not have an defined collating sequence.
Ticket [1b8d7264567eb6fc].
FossilOrigin-Name: 4a5851893c3d71cc823b6ab5df5e58a852cd322fff26290f1ea05b63d67f564a
Diffstat (limited to 'src/callback.c')
-rw-r--r-- | src/callback.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/callback.c b/src/callback.c index 3d991901d..421cef281 100644 --- a/src/callback.c +++ b/src/callback.c @@ -163,18 +163,31 @@ CollSeq *sqlite3FindCollSeq( int create /* True to create CollSeq if doesn't already exist */ ){ CollSeq *pColl; + assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); + assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); if( zName ){ pColl = findCollSeqEntry(db, zName, create); + if( pColl ) pColl += enc-1; }else{ pColl = db->pDfltColl; } - assert( SQLITE_UTF8==1 && SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); - assert( enc>=SQLITE_UTF8 && enc<=SQLITE_UTF16BE ); - if( pColl ) pColl += enc-1; return pColl; } /* +** Change the text encoding for a database connection. This means that +** the pDfltColl must change as well. +*/ +void sqlite3SetTextEncoding(sqlite3 *db, u8 enc){ + assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); + db->enc = enc; + /* EVIDENCE-OF: R-08308-17224 The default collating function for all + ** strings is BINARY. + */ + db->pDfltColl = sqlite3FindCollSeq(db, enc, sqlite3StrBINARY, 0); +} + +/* ** This function is responsible for invoking the collation factory callback ** or substituting a collation sequence of a different encoding when the ** requested collation sequence is not available in the desired encoding. |