Patch release update
This commit is contained in:
parent
4e7d73dd4e
commit
b1e2727d12
Binary file not shown.
Binary file not shown.
BIN
lib/sqlite3.lib
BIN
lib/sqlite3.lib
Binary file not shown.
@ -12,10 +12,9 @@ when ODIN_OS == .Windows {
|
|||||||
foreign import sqlite "system:sqlite3"
|
foreign import sqlite "system:sqlite3"
|
||||||
}
|
}
|
||||||
|
|
||||||
VERSION :: "3.47.0"
|
VERSION :: "3.47.1"
|
||||||
VERSION_NUMBER :: 3047000
|
VERSION_NUMBER :: 3047001
|
||||||
SOURCE_ID :: "2024-10-21 16:30:22 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e"
|
SOURCE_ID :: "2024-11-25 12:07:48 b95d11e958643b969c47a8e5857f3793b9e69700b8f1469371386369a26e577e"
|
||||||
|
|
||||||
|
|
||||||
@(default_calling_convention = "cdecl", link_prefix = "sqlite3_")
|
@(default_calling_convention = "cdecl", link_prefix = "sqlite3_")
|
||||||
foreign sqlite {
|
foreign sqlite {
|
||||||
@ -634,6 +633,7 @@ Io_Cap :: enum u16 {
|
|||||||
POWERSAFE_OVERWRITE = 0x00001000,
|
POWERSAFE_OVERWRITE = 0x00001000,
|
||||||
IMMUTABLE = 0x00002000,
|
IMMUTABLE = 0x00002000,
|
||||||
BATCH_ATOMIC = 0x00004000,
|
BATCH_ATOMIC = 0x00004000,
|
||||||
|
SUBPAGE_READ = 0x00008000,
|
||||||
}
|
}
|
||||||
|
|
||||||
File_Lock :: enum u8 {
|
File_Lock :: enum u8 {
|
||||||
|
118
src/sqlite3.c
118
src/sqlite3.c
@ -1,6 +1,6 @@
|
|||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
** This file is an amalgamation of many separate C source files from SQLite
|
** This file is an amalgamation of many separate C source files from SQLite
|
||||||
** version 3.47.0. By combining all the individual C code files into this
|
** version 3.47.1. By combining all the individual C code files into this
|
||||||
** single large file, the entire code can be compiled as a single translation
|
** single large file, the entire code can be compiled as a single translation
|
||||||
** unit. This allows many compilers to do optimizations that would not be
|
** unit. This allows many compilers to do optimizations that would not be
|
||||||
** possible if the files were compiled separately. Performance improvements
|
** possible if the files were compiled separately. Performance improvements
|
||||||
@ -18,7 +18,7 @@
|
|||||||
** separate file. This file contains only code for the core SQLite library.
|
** separate file. This file contains only code for the core SQLite library.
|
||||||
**
|
**
|
||||||
** The content in this amalgamation comes from Fossil check-in
|
** The content in this amalgamation comes from Fossil check-in
|
||||||
** 03a9703e27c44437c39363d0baf82db4ebc9.
|
** b95d11e958643b969c47a8e5857f3793b9e6.
|
||||||
*/
|
*/
|
||||||
#define SQLITE_CORE 1
|
#define SQLITE_CORE 1
|
||||||
#define SQLITE_AMALGAMATION 1
|
#define SQLITE_AMALGAMATION 1
|
||||||
@ -462,9 +462,9 @@ extern "C" {
|
|||||||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||||
** [sqlite_version()] and [sqlite_source_id()].
|
** [sqlite_version()] and [sqlite_source_id()].
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.47.0"
|
#define SQLITE_VERSION "3.47.1"
|
||||||
#define SQLITE_VERSION_NUMBER 3047000
|
#define SQLITE_VERSION_NUMBER 3047001
|
||||||
#define SQLITE_SOURCE_ID "2024-10-21 16:30:22 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e"
|
#define SQLITE_SOURCE_ID "2024-11-25 12:07:48 b95d11e958643b969c47a8e5857f3793b9e69700b8f1469371386369a26e577e"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers
|
** CAPI3REF: Run-Time Library Version Numbers
|
||||||
@ -968,6 +968,13 @@ SQLITE_API int sqlite3_exec(
|
|||||||
** filesystem supports doing multiple write operations atomically when those
|
** filesystem supports doing multiple write operations atomically when those
|
||||||
** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and
|
** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and
|
||||||
** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE].
|
** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE].
|
||||||
|
**
|
||||||
|
** The SQLITE_IOCAP_SUBPAGE_READ property means that it is ok to read
|
||||||
|
** from the database file in amounts that are not a multiple of the
|
||||||
|
** page size and that do not begin at a page boundary. Without this
|
||||||
|
** property, SQLite is careful to only do full-page reads and write
|
||||||
|
** on aligned pages, with the one exception that it will do a sub-page
|
||||||
|
** read of the first page to access the database header.
|
||||||
*/
|
*/
|
||||||
#define SQLITE_IOCAP_ATOMIC 0x00000001
|
#define SQLITE_IOCAP_ATOMIC 0x00000001
|
||||||
#define SQLITE_IOCAP_ATOMIC512 0x00000002
|
#define SQLITE_IOCAP_ATOMIC512 0x00000002
|
||||||
@ -984,6 +991,7 @@ SQLITE_API int sqlite3_exec(
|
|||||||
#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000
|
#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000
|
||||||
#define SQLITE_IOCAP_IMMUTABLE 0x00002000
|
#define SQLITE_IOCAP_IMMUTABLE 0x00002000
|
||||||
#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000
|
#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000
|
||||||
|
#define SQLITE_IOCAP_SUBPAGE_READ 0x00008000
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: File Locking Levels
|
** CAPI3REF: File Locking Levels
|
||||||
@ -1130,6 +1138,7 @@ struct sqlite3_file {
|
|||||||
** <li> [SQLITE_IOCAP_POWERSAFE_OVERWRITE]
|
** <li> [SQLITE_IOCAP_POWERSAFE_OVERWRITE]
|
||||||
** <li> [SQLITE_IOCAP_IMMUTABLE]
|
** <li> [SQLITE_IOCAP_IMMUTABLE]
|
||||||
** <li> [SQLITE_IOCAP_BATCH_ATOMIC]
|
** <li> [SQLITE_IOCAP_BATCH_ATOMIC]
|
||||||
|
** <li> [SQLITE_IOCAP_SUBPAGE_READ]
|
||||||
** </ul>
|
** </ul>
|
||||||
**
|
**
|
||||||
** The SQLITE_IOCAP_ATOMIC property means that all writes of
|
** The SQLITE_IOCAP_ATOMIC property means that all writes of
|
||||||
@ -32298,6 +32307,7 @@ SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExp
|
|||||||
pExpr = pExpr->pLeft;
|
pExpr = pExpr->pLeft;
|
||||||
}
|
}
|
||||||
if( pExpr==0 ) return;
|
if( pExpr==0 ) return;
|
||||||
|
if( ExprHasProperty(pExpr, EP_FromDDL) ) return;
|
||||||
db->errByteOffset = pExpr->w.iOfst;
|
db->errByteOffset = pExpr->w.iOfst;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42591,6 +42601,7 @@ static void setDeviceCharacteristics(unixFile *pFd){
|
|||||||
if( pFd->ctrlFlags & UNIXFILE_PSOW ){
|
if( pFd->ctrlFlags & UNIXFILE_PSOW ){
|
||||||
pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE;
|
pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE;
|
||||||
}
|
}
|
||||||
|
pFd->deviceCharacteristics |= SQLITE_IOCAP_SUBPAGE_READ;
|
||||||
|
|
||||||
pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
|
pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
|
||||||
}
|
}
|
||||||
@ -50391,7 +50402,7 @@ static int winSectorSize(sqlite3_file *id){
|
|||||||
*/
|
*/
|
||||||
static int winDeviceCharacteristics(sqlite3_file *id){
|
static int winDeviceCharacteristics(sqlite3_file *id){
|
||||||
winFile *p = (winFile*)id;
|
winFile *p = (winFile*)id;
|
||||||
return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN |
|
return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | SQLITE_IOCAP_SUBPAGE_READ |
|
||||||
((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0);
|
((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51779,7 +51790,7 @@ static int winOpen(
|
|||||||
|
|
||||||
int rc = SQLITE_OK; /* Function Return Code */
|
int rc = SQLITE_OK; /* Function Return Code */
|
||||||
#if !defined(NDEBUG) || SQLITE_OS_WINCE
|
#if !defined(NDEBUG) || SQLITE_OS_WINCE
|
||||||
int eType = flags&0xFFFFFF00; /* Type of file to open */
|
int eType = flags&0x0FFF00; /* Type of file to open */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE);
|
int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE);
|
||||||
@ -57999,18 +58010,26 @@ static const unsigned char aJournalMagic[] = {
|
|||||||
** Return true if page pgno can be read directly from the database file
|
** Return true if page pgno can be read directly from the database file
|
||||||
** by the b-tree layer. This is the case if:
|
** by the b-tree layer. This is the case if:
|
||||||
**
|
**
|
||||||
** * the database file is open,
|
** (1) the database file is open
|
||||||
** * there are no dirty pages in the cache, and
|
** (2) the VFS for the database is able to do unaligned sub-page reads
|
||||||
** * the desired page is not currently in the wal file.
|
** (3) there are no dirty pages in the cache, and
|
||||||
|
** (4) the desired page is not currently in the wal file.
|
||||||
*/
|
*/
|
||||||
SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
|
SQLITE_PRIVATE int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){
|
||||||
if( pPager->fd->pMethods==0 ) return 0;
|
assert( pPager!=0 );
|
||||||
if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0;
|
assert( pPager->fd!=0 );
|
||||||
|
if( pPager->fd->pMethods==0 ) return 0; /* Case (1) */
|
||||||
|
assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 );
|
||||||
|
if( (pPager->fd->pMethods->xDeviceCharacteristics(pPager->fd)
|
||||||
|
& SQLITE_IOCAP_SUBPAGE_READ)==0 ){
|
||||||
|
return 0; /* Case (2) */
|
||||||
|
}
|
||||||
|
if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; /* Failed (3) */
|
||||||
#ifndef SQLITE_OMIT_WAL
|
#ifndef SQLITE_OMIT_WAL
|
||||||
if( pPager->pWal ){
|
if( pPager->pWal ){
|
||||||
u32 iRead = 0;
|
u32 iRead = 0;
|
||||||
(void)sqlite3WalFindFrame(pPager->pWal, pgno, &iRead);
|
(void)sqlite3WalFindFrame(pPager->pWal, pgno, &iRead);
|
||||||
return iRead==0;
|
return iRead==0; /* Condition (4) */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
@ -158939,6 +158958,7 @@ static Expr *removeUnindexableInClauseTerms(
|
|||||||
pNew->pLeft->x.pList = pLhs;
|
pNew->pLeft->x.pList = pLhs;
|
||||||
}
|
}
|
||||||
pSelect->pEList = pRhs;
|
pSelect->pEList = pRhs;
|
||||||
|
pSelect->selId = ++pParse->nSelect; /* Req'd for SubrtnSig validity */
|
||||||
if( pLhs && pLhs->nExpr==1 ){
|
if( pLhs && pLhs->nExpr==1 ){
|
||||||
/* Take care here not to generate a TK_VECTOR containing only a
|
/* Take care here not to generate a TK_VECTOR containing only a
|
||||||
** single value. Since the parser never creates such a vector, some
|
** single value. Since the parser never creates such a vector, some
|
||||||
@ -189798,10 +189818,15 @@ static int fts3PoslistPhraseMerge(
|
|||||||
if( *p1==POS_COLUMN ){
|
if( *p1==POS_COLUMN ){
|
||||||
p1++;
|
p1++;
|
||||||
p1 += fts3GetVarint32(p1, &iCol1);
|
p1 += fts3GetVarint32(p1, &iCol1);
|
||||||
|
/* iCol1==0 indicates corruption. Column 0 does not have a POS_COLUMN
|
||||||
|
** entry, so this is actually end-of-doclist. */
|
||||||
|
if( iCol1==0 ) return 0;
|
||||||
}
|
}
|
||||||
if( *p2==POS_COLUMN ){
|
if( *p2==POS_COLUMN ){
|
||||||
p2++;
|
p2++;
|
||||||
p2 += fts3GetVarint32(p2, &iCol2);
|
p2 += fts3GetVarint32(p2, &iCol2);
|
||||||
|
/* As above, iCol2==0 indicates corruption. */
|
||||||
|
if( iCol2==0 ) return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
while( 1 ){
|
while( 1 ){
|
||||||
@ -192972,7 +192997,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){
|
|||||||
nTmp += p->pRight->pPhrase->doclist.nList;
|
nTmp += p->pRight->pPhrase->doclist.nList;
|
||||||
}
|
}
|
||||||
nTmp += p->pPhrase->doclist.nList;
|
nTmp += p->pPhrase->doclist.nList;
|
||||||
aTmp = sqlite3_malloc64(nTmp*2);
|
aTmp = sqlite3_malloc64(nTmp*2 + FTS3_VARINT_MAX);
|
||||||
if( !aTmp ){
|
if( !aTmp ){
|
||||||
*pRc = SQLITE_NOMEM;
|
*pRc = SQLITE_NOMEM;
|
||||||
res = 0;
|
res = 0;
|
||||||
@ -194525,10 +194550,11 @@ static int getNextString(
|
|||||||
Fts3PhraseToken *pToken;
|
Fts3PhraseToken *pToken;
|
||||||
|
|
||||||
p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken));
|
p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken));
|
||||||
if( !p ) goto no_mem;
|
|
||||||
|
|
||||||
zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte);
|
zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte);
|
||||||
if( !zTemp ) goto no_mem;
|
if( !zTemp || !p ){
|
||||||
|
rc = SQLITE_NOMEM;
|
||||||
|
goto getnextstring_out;
|
||||||
|
}
|
||||||
|
|
||||||
assert( nToken==ii );
|
assert( nToken==ii );
|
||||||
pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii];
|
pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii];
|
||||||
@ -194543,9 +194569,6 @@ static int getNextString(
|
|||||||
nToken = ii+1;
|
nToken = ii+1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pModule->xClose(pCursor);
|
|
||||||
pCursor = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( rc==SQLITE_DONE ){
|
if( rc==SQLITE_DONE ){
|
||||||
@ -194553,7 +194576,10 @@ static int getNextString(
|
|||||||
char *zBuf = 0;
|
char *zBuf = 0;
|
||||||
|
|
||||||
p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp);
|
p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp);
|
||||||
if( !p ) goto no_mem;
|
if( !p ){
|
||||||
|
rc = SQLITE_NOMEM;
|
||||||
|
goto getnextstring_out;
|
||||||
|
}
|
||||||
memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p);
|
memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p);
|
||||||
p->eType = FTSQUERY_PHRASE;
|
p->eType = FTSQUERY_PHRASE;
|
||||||
p->pPhrase = (Fts3Phrase *)&p[1];
|
p->pPhrase = (Fts3Phrase *)&p[1];
|
||||||
@ -194561,11 +194587,9 @@ static int getNextString(
|
|||||||
p->pPhrase->nToken = nToken;
|
p->pPhrase->nToken = nToken;
|
||||||
|
|
||||||
zBuf = (char *)&p->pPhrase->aToken[nToken];
|
zBuf = (char *)&p->pPhrase->aToken[nToken];
|
||||||
|
assert( nTemp==0 || zTemp );
|
||||||
if( zTemp ){
|
if( zTemp ){
|
||||||
memcpy(zBuf, zTemp, nTemp);
|
memcpy(zBuf, zTemp, nTemp);
|
||||||
sqlite3_free(zTemp);
|
|
||||||
}else{
|
|
||||||
assert( nTemp==0 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(jj=0; jj<p->pPhrase->nToken; jj++){
|
for(jj=0; jj<p->pPhrase->nToken; jj++){
|
||||||
@ -194575,17 +194599,17 @@ static int getNextString(
|
|||||||
rc = SQLITE_OK;
|
rc = SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppExpr = p;
|
getnextstring_out:
|
||||||
return rc;
|
|
||||||
no_mem:
|
|
||||||
|
|
||||||
if( pCursor ){
|
if( pCursor ){
|
||||||
pModule->xClose(pCursor);
|
pModule->xClose(pCursor);
|
||||||
}
|
}
|
||||||
sqlite3_free(zTemp);
|
sqlite3_free(zTemp);
|
||||||
sqlite3_free(p);
|
if( rc!=SQLITE_OK ){
|
||||||
*ppExpr = 0;
|
sqlite3_free(p);
|
||||||
return SQLITE_NOMEM;
|
p = 0;
|
||||||
|
}
|
||||||
|
*ppExpr = p;
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -232806,7 +232830,27 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){
|
|||||||
/************** End of sqlite3session.c **************************************/
|
/************** End of sqlite3session.c **************************************/
|
||||||
/************** Begin file fts5.c ********************************************/
|
/************** Begin file fts5.c ********************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This, the "fts5.c" source file, is a composite file that is itself
|
||||||
|
** assembled from the following files:
|
||||||
|
**
|
||||||
|
** fts5.h
|
||||||
|
** fts5Int.h
|
||||||
|
** fts5parse.h <--- Generated from fts5parse.y by Lemon
|
||||||
|
** fts5parse.c <--- Generated from fts5parse.y by Lemon
|
||||||
|
** fts5_aux.c
|
||||||
|
** fts5_buffer.c
|
||||||
|
** fts5_config.c
|
||||||
|
** fts5_expr.c
|
||||||
|
** fts5_hash.c
|
||||||
|
** fts5_index.c
|
||||||
|
** fts5_main.c
|
||||||
|
** fts5_storage.c
|
||||||
|
** fts5_tokenize.c
|
||||||
|
** fts5_unicode2.c
|
||||||
|
** fts5_varint.c
|
||||||
|
** fts5_vocab.c
|
||||||
|
*/
|
||||||
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5)
|
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5)
|
||||||
|
|
||||||
#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
|
#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
|
||||||
@ -232816,6 +232860,12 @@ SQLITE_API int sqlite3session_config(int op, void *pArg){
|
|||||||
# undef NDEBUG
|
# undef NDEBUG
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_STDINT_H
|
||||||
|
/* #include <stdint.h> */
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_INTTYPES_H
|
||||||
|
/* #include <inttypes.h> */
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
** 2014 May 31
|
** 2014 May 31
|
||||||
**
|
**
|
||||||
@ -254888,7 +254938,7 @@ static void fts5SourceIdFunc(
|
|||||||
){
|
){
|
||||||
assert( nArg==0 );
|
assert( nArg==0 );
|
||||||
UNUSED_PARAM2(nArg, apUnused);
|
UNUSED_PARAM2(nArg, apUnused);
|
||||||
sqlite3_result_text(pCtx, "fts5: 2024-10-21 16:30:22 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e", -1, SQLITE_TRANSIENT);
|
sqlite3_result_text(pCtx, "fts5: 2024-11-25 12:07:48 b95d11e958643b969c47a8e5857f3793b9e69700b8f1469371386369a26e577e", -1, SQLITE_TRANSIENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -260079,7 +260129,7 @@ static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Here ends the fts5.c composite file. */
|
||||||
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */
|
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */
|
||||||
|
|
||||||
/************** End of fts5.c ************************************************/
|
/************** End of fts5.c ************************************************/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user