commit:     dd5e959e06f605b7caa81d8f44ae7b83f98440fb
Author:     Arfrever Frehtes Taifersar Arahesis <Arfrever <AT> Apache <DOT> Org>
AuthorDate: Mon Jul 27 00:00:00 2020 +0000
Commit:     Mike Gilbert <floppym <AT> gentoo <DOT> org>
CommitDate: Wed Jul 29 18:46:04 2020 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=dd5e959e

dev-db/sqlite: Security fixes and other fixes (3.32.3-r1).

Bug: https://bugs.gentoo.org/732604
Closes: https://bugs.gentoo.org/685874
Closes: https://bugs.gentoo.org/733092
Signed-off-by: Arfrever Frehtes Taifersar Arahesis <Arfrever <AT> Apache.Org>
Signed-off-by: Mike Gilbert <floppym <AT> gentoo.org>

 .../sqlite/files/sqlite-3.32.3-backports_1.patch   | 361 +++++++++++++++++++++
 .../sqlite/files/sqlite-3.32.3-backports_2.patch   | 302 +++++++++++++++++
 .../sqlite/files/sqlite-3.32.3-backports_3.patch   | 220 +++++++++++++
 dev-db/sqlite/sqlite-3.32.3-r1.ebuild              | 339 +++++++++++++++++++
 4 files changed, 1222 insertions(+)

diff --git a/dev-db/sqlite/files/sqlite-3.32.3-backports_1.patch 
b/dev-db/sqlite/files/sqlite-3.32.3-backports_1.patch
new file mode 100644
index 00000000000..256d18ee76f
--- /dev/null
+++ b/dev-db/sqlite/files/sqlite-3.32.3-backports_1.patch
@@ -0,0 +1,361 @@
+https://sqlite.org/src/info/d48af4d2cfff3d5f
+https://sqlite.org/src/info/cc888878ea8d5bc7
+https://sqlite.org/src/info/be545f85a6ef09cc
+https://sqlite.org/src/info/6e0ffa2053124168
+https://sqlite.org/src/info/4d0cfb1236884349
+https://sqlite.org/src/info/ccff8cb8267d4c56
+https://sqlite.org/src/info/5124732370fd53c9
+
+--- /ext/fts3/fts3.c
++++ /ext/fts3/fts3.c
+@@ -2068,7 +2068,7 @@
+   sqlite3_int64 *piPrev,          /* IN/OUT: Previous value written to list */
+   sqlite3_int64 iVal              /* Write this value to the list */
+ ){
+-  assert( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) );
++  assert_fts3_nc( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) );
+   *pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev);
+   *piPrev = iVal;
+ }
+@@ -5208,10 +5208,12 @@
+   );
+   if( res ){
+     nNew = (int)(pOut - pPhrase->doclist.pList) - 1;
+-    assert( pPhrase->doclist.pList[nNew]=='\0' );
+-    assert( nNew<=pPhrase->doclist.nList && nNew>0 );
+-    memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew);
+-    pPhrase->doclist.nList = nNew;
++    if( nNew>=0 ){
++      assert( pPhrase->doclist.pList[nNew]=='\0' );
++      assert( nNew<=pPhrase->doclist.nList && nNew>0 );
++      memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew);
++      pPhrase->doclist.nList = nNew;
++    }
+     *paPoslist = pPhrase->doclist.pList;
+     *pnToken = pPhrase->nToken;
+   }
+@@ -5563,7 +5565,10 @@
+         }else
+ #endif
+         {
+-          bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId);
++          bHit = ( 
++              pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId
++           && pExpr->pPhrase->doclist.nList>0
++          );
+         }
+         break;
+       }
+--- /ext/fts3/fts3_write.c
++++ /ext/fts3/fts3_write.c
+@@ -341,7 +341,9 @@
+ ** created by merging the oldest :2 segments from absolute level :1. See 
+ ** function sqlite3Fts3Incrmerge() for details.  */
+ /* 29 */ "SELECT 2 * total(1 + leaves_end_block - start_block) "
+-         "  FROM %Q.'%q_segdir' WHERE level = ? AND idx < ?",
++         "  FROM (SELECT * FROM %Q.'%q_segdir' "
++         "        WHERE level = ? ORDER BY idx ASC LIMIT ?"
++         "  )",
+ 
+ /* SQL_DELETE_SEGDIR_ENTRY
+ **   Delete the %_segdir entry on absolute level :1 with index :2.  */
+@@ -2853,6 +2855,19 @@
+   return SQLITE_OK;
+ }
+ 
++static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){
++  if( nReq>pCsr->nBuffer ){
++    char *aNew;
++    pCsr->nBuffer = nReq*2;
++    aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer);
++    if( !aNew ){
++      return SQLITE_NOMEM;
++    }
++    pCsr->aBuffer = aNew;
++  }
++  return SQLITE_OK;
++}
++
+ 
+ int sqlite3Fts3SegReaderStep(
+   Fts3Table *p,                   /* Virtual table handle */
+@@ -2987,15 +3002,9 @@
+           }
+ 
+           nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0);
+-          if( nDoclist+nByte>pCsr->nBuffer ){
+-            char *aNew;
+-            pCsr->nBuffer = (nDoclist+nByte)*2;
+-            aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer);
+-            if( !aNew ){
+-              return SQLITE_NOMEM;
+-            }
+-            pCsr->aBuffer = aNew;
+-          }
++
++          rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist);
++          if( rc ) return rc;
+ 
+           if( isFirst ){
+             char *a = &pCsr->aBuffer[nDoclist];
+@@ -3020,6 +3029,9 @@
+         fts3SegReaderSort(apSegment, nMerge, j, xCmp);
+       }
+       if( nDoclist>0 ){
++        rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING);
++        if( rc ) return rc;
++        memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING);
+         pCsr->aDoclist = pCsr->aBuffer;
+         pCsr->nDoclist = nDoclist;
+         rc = SQLITE_ROW;
+@@ -4288,7 +4300,7 @@
+       int i;
+       int nHeight = (int)aRoot[0];
+       NodeWriter *pNode;
+-      if( nHeight<1 || nHeight>FTS_MAX_APPENDABLE_HEIGHT ){
++      if( nHeight<1 || nHeight>=FTS_MAX_APPENDABLE_HEIGHT ){
+         sqlite3_reset(pSelect);
+         return FTS_CORRUPT_VTAB;
+       }
+--- /src/expr.c
++++ /src/expr.c
+@@ -4272,7 +4272,9 @@
+       int nCol;
+       testcase( op==TK_EXISTS );
+       testcase( op==TK_SELECT );
+-      if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){
++      if( pParse->db->mallocFailed ){
++        return 0;
++      }else if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 
){
+         sqlite3SubselectError(pParse, nCol, 1);
+       }else{
+         return sqlite3CodeSubselect(pParse, pExpr);
+--- /test/fts3corrupt4.test
++++ /test/fts3corrupt4.test
+@@ -6123,4 +6123,163 @@
+   SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'rtree ner "json1^enable"';
+ }
+ 
++#-------------------------------------------------------------------------
++do_execsql_test 42.1 {
++  CREATE VIRTUAL TABLE f USING fts3(a, b);
++}
++do_execsql_test 42.2 {
++  INSERT INTO f_segdir VALUES(0,2,1111,0,0,X'00');
++  INSERT INTO f_segdir VALUES(0,3,0   ,0,0,X'00013003010200');
++}
++do_execsql_test 42.3 {
++  INSERT INTO f(f) VALUES ('merge=107,2');
++}
++
++#-------------------------------------------------------------------------
++reset_db
++set saved $sqlite_fts3_enable_parentheses
++set sqlite_fts3_enable_parentheses 1
++do_execsql_test 43.1 {
++  CREATE VIRTUAL TABLE def USING fts3(xyz);
++  INSERT INTO def_segdir VALUES(0,0,0,0,0, X'0001310301c9000103323334050d81');
++} {}
++
++do_execsql_test 43.2 {
++  SELECT rowid FROM def WHERE def MATCH '1 NEAR 1'
++} {1}
++
++set sqlite_fts3_enable_parentheses $saved
++
++#-------------------------------------------------------------------------
++reset_db
++do_execsql_test 44.1 {
++  CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 
VARCHAR(8),col2 BINARY,col3 BINARY);
++  INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL);
++  INSERT INTO t0_segdir VALUES(0,0,0,0,'0 
42',X'00013103010200010332333405010201ba00000461616161050101020200000462626262050101030200');
++}
++
++do_execsql_test 44.2 {
++  SELECT matchinfo(t0, t0) IS NULL FROM t0 WHERE t0 MATCH '1*'
++} {0}
++
++#-------------------------------------------------------------------------
++#
++reset_db
++do_test 45.0 {
++  sqlite3 db {}
++  db deserialize [decode_hexdb {
++.open --hexdb
++| size 24576 pagesize 4096 filename crash-65c98512cc9e49.db
++| page 1 offset 0
++|      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
++|     16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06   .....@  ........
++|     96: 00 00 00 00 0d 0e fc 00 06 0d bc 00 0f ca 0f 6c   ...............l
++|    112: 0f 04 0e 13 0e c9 0d bc 00 00 00 00 00 00 00 00   ................
++|   3504: 00 00 00 00 00 00 00 00 00 00 00 00 55 06 07 17   ............U...
++|   3520: 1b 1b 01 81 01 74 61 62 6c 65 78 31 5f 73 74 61   .....tablex1_sta
++|   3536: 74 78 31 5f 73 74 61 74 06 43 52 45 41 54 45 20   tx1_stat.CREATE 
++|   3552: 54 41 42 4c 45 20 27 78 31 5f 73 74 61 74 27 28   TABLE 'x1_stat'(
++|   3568: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41   id INTEGER PRIMA
++|   3584: 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 4c   RY KEY, value BL
++|   3600: 41 82 29 81 33 04 07 17 1f 1f 01 82 35 74 61 62   A.).3.......5tab
++|   3616: 6c 65 78 31 5f 73 65 67 64 69 72 78 31 5f 73 65   lex1_segdirx1_se
++|   3632: 67 64 69 72 04 43 52 45 41 54 45 20 54 41 42 4c   gdir.CREATE TABL
++|   3648: 45 20 27 78 31 5f 73 65 67 64 69 72 27 28 6c 65   E 'x1_segdir'(le
++|   3664: 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 64 78 20   vel INTEGER,idx 
++|   3680: 49 4e 54 45 47 45 52 2c 73 74 61 72 74 5f 62 6c   INTEGER,start_bl
++|   3696: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c 65 61 76   ock INTEGER,leav
++|   3712: 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54   es_end_block INT
++|   3728: 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 6b 20 49   EGER,end_block I
++|   3744: 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 4c 4f 42   NTEGER,root BLOB
++|   3760: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76   ,PRIMARY KEY(lev
++|   3776: 65 6c 2c 20 69 64 78 29 29 31 05 06 17 45 1f 01   el, idx))1...E..
++|   3792: 00 69 6e 64 65 78 73 71 6c 69 74 65 5f 61 75 74   .indexsqlite_aut
++|   3808: 6f 69 6e 64 65 78 5f 78 31 5f 73 65 67 64 69 72   oindex_x1_segdir
++|   3824: 5f 31 78 31 5f 73 65 67 64 69 72 05 00 00 00 08   _1x1_segdir.....
++|   3840: 60 00 00 00 66 03 07 17 23 23 01 81 13 74 61 62   `...f...##...tab
++|   3856: 6c 65 78 31 5f 73 65 67 6d 65 6e 74 73 78 31 5f   lex1_segmentsx1_
++|   3872: 73 65 67 6d 65 6e 74 73 03 43 52 45 41 54 45 20   segments.CREATE 
++|   3888: 54 41 42 4c 45 20 27 78 31 5f 73 65 67 6d 65 6e   TABLE 'x1_segmen
++|   3904: 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45   ts'(blockid INTE
++|   3920: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c   GER PRIMARY KEY,
++|   3936: 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c 02 07 17    block BLOB)....
++|   3952: 21 21 01 81 03 74 61 62 6c 65 78 31 5f 63 6f 6e   !!...tablex1_con
++|   3968: 74 65 6e 74 78 31 5f 63 6f 6e 74 65 6e 74 02 43   tentx1_content.C
++|   3984: 52 45 41 54 45 20 54 41 42 4c 45 20 27 78 31 5f   REATE TABLE 'x1_
++|   4000: 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 64 20 49   content'(docid I
++|   4016: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b   NTEGER PRIMARY K
++|   4032: 45 59 2c 20 27 63 30 78 27 29 34 01 06 17 11 11   EY, 'c0x')4.....
++|   4048: 08 57 74 61 62 6c 65 78 31 78 31 43 52 45 41 54   .Wtablex1x1CREAT
++|   4064: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20   E VIRTUAL TABLE 
++|   4080: 78 31 20 55 53 49 4e 47 20 66 74 73 33 28 78 29   x1 USING fts3(x)
++| page 2 offset 4096
++|      0: 0d 00 00 00 11 0f 77 f0 0f f8 0f f0 0f e8 0f e0   ......w.........
++|     16: 0f d8 0f d0 0f c8 0f c0 00 00 00 00 00 00 00 00   ................
++|   3952: 00 00 00 00 00 00 00 00 06 11 03 00 13 77 78 79   .............wxy
++|   3968: 06 10 03 00 13 74 75 76 06 0f 03 00 13 71 33 73   .....tuv.....q3s
++|   3984: 06 0e 03 00 13 6e 6f 70 06 0d 03 00 13 6b 6c 6d   .....nop.....klm
++|   4000: 06 0c 03 04 c3 68 69 6a 06 0b 03 00 13 65 66 67   .....hij.....efg
++|   4016: 06 0a 03 00 13 62 63 64 06 09 03 00 13 79 7a 61   .....bcd.....yza
++|   4032: 06 08 03 00 13 76 77 78 06 07 03 00 13 73 74 75   .....vwx.....stu
++|   4048: 06 06 03 00 13 70 71 72 06 05 03 00 13 6d 6e 6f   .....pqr.....mno
++|   4064: 06 03 03 00 13 6a 6b 6c 06 03 03 00 13 67 68 69   .....jkl.....ghi
++|   4080: 06 02 02 00 03 64 65 66 06 01 03 00 13 61 52 63   .....def.....aRc
++| page 3 offset 8192
++|      0: 0d 00 00 00 03 0f a7 00 0f b5 0f a7 0f fa 01 00   ................
++|   4000: 00 00 00 00 00 00 00 0c 02 03 00 1e 00 03 6b 6c   ..............kl
++|   4016: 6d 03 0d 02 00 43 01 04 00 81 0a 00 03 61 62 63   m....C.......abc
++|   4032: 03 0b 32 00 00 03 62 63 64 03 0a 02 00 00 03 64   ..2...bcd......d
++|   4048: 69 26 03 02 02 00 00 03 65 66 67 03 0b 02 00 00   i&......efg.....
++|   4064: 03 67 68 69 03 03 02 00 00 03 68 69 6a 03 0c 02   .ghi......hij...
++|   4080: 00 00 03 6a 6a 2c 03 04 02 00 03 81 00 03 00 00   ...jj,..........
++| page 4 offset 12288
++|      0: 0d 0f 3a 00 05 0f 25 00 0f 9e 0f 88 0f 43 0f 25   ..:...%......C.%
++|     16: 0f 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00   .r..............
++|   3856: 00 00 00 00 00 00 00 00 00 56 01 08 08 13 1e 03   .........V......
++|   3872: 30 20 39 00 03 13 05 07 08 08 18 08 13 1e 30 20   0 9...........0 
++|   3888: 39 00 03 77 78 79 03 11 02 00 0f 6c 00 09 01 08   9..wxy.....l....
++|   3904: 08 15 54 27 04 07 09 01 08 08 15 42 02 30 20 33   ..T'.......B.0 3
++|   3920: 36 00 03 6e 6f 70 03 0e 02 00 00 03 71 72 73 03   6..nop......qrs.
++|   3936: 0f 02 00 00 03 74 75 76 03 10 02 00 0f cf b1 06   .....tuv........
++|   3952: 01 08 14 06 07 01 08 09 01 1b 14 02 02 31 32 38   .............128
++|   3968: 20 2d 37 32 10 01 01 6b 14 03 07 09 09 08 08 15    -72...k........
++|   3984: 1e 30 20 33 36 00 03 79 7a 61 03 09 02 00 2f 02   .0 36..yza..../.
++|   4000: 07 09 08 08 08 15 54 30 20 33 36 00 03 6d 6e 6f   ......T0 36..mno
++|   4016: 03 05 02 00 00 03 70 71 72 03 06 02 00 00 03 73   ......pqr......s
++|   4032: 74 75 03 07 02 00 00 03 76 77 78 03 08 02 00 00   tu......vwx.....
++|   4048: 00 00 4a 08 08 08 15 54 30 20 33 36 00 03 61 62   ..J....T0 36..ab
++|   4064: 63 03 01 02 00 00 03 64 65 66 03 02 02 00 00 03   c......def......
++|   4080: 67 68 69 03 03 67 00 00 03 6a 6b 6c 03 04 02 00   ghi..g...jkl....
++| page 5 offset 16384
++|      0: 0a 0f e7 00 05 0f da 00 0f e1 0f fa 0f f4 0f ed   ................
++|     16: 0f da 0f 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
++|   4048: 00 00 00 00 00 00 00 1a 01 03 06 04 01 08 01 02   ................
++|   4064: 06 05 04 08 08 01 05 00 00 00 06 01 03 06 04 09   ................
++|   4080: 02 01 02 04 05 04 09 09 01 03 05 04 09 08 01 02   ................
++| page 6 offset 20480
++|      0: 0d 00 10 00 01 0f f9 00 0f f9 00 00 00 00 00 00   ................
++|   4080: 00 00 00 00 00 00 00 00 00 05 01 03 00 10 01 03   ................
++| end crash-65c98512cc9e49.db
++}]} {}
++
++do_catchsql_test 45.2 {
++  INSERT INTO x1(x1) VALUES( 'merge=1' )
++} {1 {database disk image is malformed}}
++
++#-------------------------------------------------------------------------
++reset_db
++set saved $sqlite_fts3_enable_parentheses
++set sqlite_fts3_enable_parentheses 1
++do_execsql_test 46.1 {
++  CREATE VIRTUAL TABLE t0 USING fts3(a INTEGER PRIMARY KEY,b,c,d);
++  INSERT INTO t0_segdir VALUES(0,0,0,0,'0 
42',X'0001310301c9000103323334050d8000f200000461616161050101020200000462626262050101030200');
++} {}
++
++do_catchsql_test 46.2 {
++  SELECT * FROM t0
++    WHERE t0 MATCH 
x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
++} {1 {database disk image is malformed}}
++
++set sqlite_fts3_enable_parentheses $saved
++
+ finish_test
+--- /test/fts3corrupt6.test
++++ /test/fts3corrupt6.test
+@@ -0,0 +1,60 @@
++# 2020 June 8
++#
++# 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 file implements regression tests for SQLite library.  The
++# focus of this script is testing the FTS3 module.
++#
++# $Id: fts3aa.test,v 1.1 2007/08/20 17:38:42 shess Exp $
++#
++
++set testdir [file dirname $argv0]
++source $testdir/tester.tcl
++source $testdir/fts3_common.tcl
++set testprefix fts3corrupt6
++
++# If SQLITE_ENABLE_FTS3 is defined, omit this file.
++ifcapable !fts3 {
++  finish_test
++  return
++}
++
++set ::saved_sqlite_fts3_enable_parentheses $::sqlite_fts3_enable_parentheses
++set sqlite_fts3_enable_parentheses 1
++sqlite3_fts3_may_be_corrupt 1
++database_may_be_corrupt
++
++do_execsql_test 1.0 {
++  BEGIN TRANSACTION;
++  CREATE TABLE t_content(col0 INTEGER);
++  PRAGMA writable_schema=ON;
++  CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 
VARCHAR(8),col2 BINARY,col3 BINARY);
++  INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL);
++  INSERT INTO t0_segdir VALUES(0,0,0,0,'0 
42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200');
++  COMMIT;
++}
++
++do_execsql_test 1.1 {
++  SELECT 0+matchinfo(t0,'yxyyxy') FROM t0 WHERE t0 MATCH CAST( 
x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d'
 AS TEXT);
++} {0}
++
++do_execsql_test 1.2 {
++  CREATE VIRTUAL TABLE t1 USING fts3(col0 INTEGER PRIMARY KEY,col1 
VARCHAR(8),col2 BINARY,col3 BINARY);
++  INSERT INTO t1_content VALUES(0,NULL,NULL,NULL,NULL);
++  INSERT INTO t1_segdir VALUES(0,0,0,0,'0 
42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200');
++}
++
++do_execsql_test 1.3 {
++  SELECT 42+matchinfo(t1,'yxyyxy')  FROM t1 WHERE t1 MATCH  
x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
++} {42}
++
++set sqlite_fts3_enable_parentheses $saved_sqlite_fts3_enable_parentheses
++finish_test
++
++

diff --git a/dev-db/sqlite/files/sqlite-3.32.3-backports_2.patch 
b/dev-db/sqlite/files/sqlite-3.32.3-backports_2.patch
new file mode 100644
index 00000000000..32b6f9b1624
--- /dev/null
+++ b/dev-db/sqlite/files/sqlite-3.32.3-backports_2.patch
@@ -0,0 +1,302 @@
+https://sqlite.org/src/info/30735432bc33cb95
+https://sqlite.org/src/info/1bd18ca35bdbf303
+https://sqlite.org/src/info/49da8bdce17ced91
+https://sqlite.org/src/info/f25a56c26e28abd4
+
+--- /ext/fts5/fts5_index.c
++++ /ext/fts5/fts5_index.c
+@@ -2321,11 +2321,11 @@
+   }
+ 
+  search_success:
+-  pIter->iLeafOffset = iOff + nNew;
+-  if( pIter->iLeafOffset>n || nNew<1 ){
++  if( (i64)iOff+nNew>n || nNew<1 ){
+     p->rc = FTS5_CORRUPT;
+     return;
+   }
++  pIter->iLeafOffset = iOff + nNew;
+   pIter->iTermLeafOffset = pIter->iLeafOffset;
+   pIter->iTermLeafPgno = pIter->iLeafPgno;
+ 
+--- /ext/fts5/test/fts5corrupt3.test
++++ /ext/fts5/test/fts5corrupt3.test
+@@ -10108,6 +10108,221 @@
+   INSERT INTO t1(t1) SELECT x FROM t2;
+ } {1 {database disk image is malformed}}
+ 
++#-------------------------------------------------------------------------
++reset_db
++do_test 69.0 {
++  sqlite3 db {}
++  db deserialize [decode_hexdb {
++.open --hexdb
++| size 32768 pagesize 4096 filename crash-31c462b8b665d0.db
++| page 1 offset 0
++|      0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00   SQLite format 3.
++|     16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08   .....@  ........
++|     32: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00   ................
++|     96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36   ...............6
++|    112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 00 00 00 00 00 00   ...k............
++|   3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74   .........1tablet
++|   3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45   2t2.CREATE TABLE
++|   3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61    t2(x)V.......ta
++|   3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63   blet1_configt1_c
++|   3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42   onfig.CREATE TAB
++|   3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b   LE 't1_config'(k
++|   3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29    PRIMARY KEY, v)
++|   3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06    WITHOUT ROWID[.
++|   3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64   ..!!...tablet1_d
++|   3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65   ocsizet1_docsize
++|   3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74   .CREATE TABLE 't
++|   3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e   1_docsize'(id IN
++|   3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45   TEGER PRIMARY KE
++|   3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21   Y, sz BLOB)^...!
++|   3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74   !...tablet1_cont
++|   3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52   entt1_content.CR
++|   3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63   EATE TABLE 't1_c
++|   3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47   ontent'(id INTEG
++|   3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20   ER PRIMARY KEY, 
++|   3776: 63 39 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19   c9, c1, c2)i....
++|   3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74   ...-tablet1_idxt
++|   3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42   1_idx.CREATE TAB
++|   3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69   LE 't1_idx'(segi
++|   3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50   d, term, pgno, P
++|   3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64   RIMARY KEY(segid
++|   3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54   , term)) WITHOUT
++|   3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74    ROWIDU........t
++|   3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61   ablet1_datat1_da
++|   3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20   ta.CREATE TABLE 
++|   3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54   't1_data'(id INT
++|   3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59   EGER PRIMARY KEY
++|   3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06   , block BLOB)8..
++|   3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52   ...._tablet1t1CR
++|   4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42   EATE VIRTUAL TAB
++|   4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35   LE t1 USING fts5
++|   4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00   (a,b,c).........
++| page 3 offset 8192
++|      0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00   ................
++|   3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18   .....J..........
++|   3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06   ...+.00.........
++|   3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30   ...........20160
++|   3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01   609...........4.
++|   3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02   ..........5.....
++|   3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04   ......0000000...
++|   3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06   ........binary..
++|   3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01   ................
++|   3344: 02 02 03 06 00 02 02 03 06 01 02 02 03 06 01 02   ................
++|   3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02   ................
++|   3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70   ............comp
++|   3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64   iler...........d
++|   3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04   bstat...........
++|   3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65   ebug...........e
++|   3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02   nable...........
++|   3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02   ................
++|   3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01   ................
++|   3488: 01 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02   ................
++|   3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02   ......xtension..
++|   3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 1a 02 03   .........fts4...
++|   3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01   ........5.......
++|   3552: 02 03 01 03 67 63 63 01 aa 03 01 02 03 01 02 03   ....gcc.........
++|   3568: 02 06 65 6f 70 6f 6c 79 10 02 03 02 02 03 01 02   ..eopoly........
++|   3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02   ...json1........
++|   3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03   ...load.........
++|   3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05   ..max...........
++|   3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04   emory...........
++|   3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e   sys5...........n
++|   3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03   ocase...........
++|   3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06   ................
++|   3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01   ................
++|   3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02   ................
++|   3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 01   ...omit.........
++|   3744: ff ff ff ff ff ff ff ff f0 00 00 00 00 00 01 02   ................
++|   3760: 58 81 96 4d 01 06 01 02 02 03 06 01 02 02 03 06   X..M............
++|   3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01   ................
++|   3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02   ................
++|   3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02   ................
++|   3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01   ..threadsafe....
++|   3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02   .......vtab.....
++|   3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01   ......x.........
++|   3872: 02 01 06 01 1e 02 01 06 01 01 02 01 06 01 01 02   ................
++|   3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01   ................
++|   3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06   ................
++|   3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01   ................
++|   3936: 00 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01   ................
++|   3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02   ................
++|   3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01   ................
++|   3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06   ................
++|   4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01   ................
++|   4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01   ................
++|   4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c   ................
++|   4048: 12 44 13 11 0f 47 13 0f 0b 0e 11 10 0f 0e 10 0f   .D...G..........
++|   4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f   D..@.......$Z$$.
++|   4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01   ...$............
++| page 4 offset 12288
++|      0: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
++|   4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02   ................
++| page 5 offset 16384
++|      0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74   ....$..........t
++|     16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5   .a.N./..........
++|     32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5   ...t.[.@.$......
++|     48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 00 00 00 00 00   .......h.O......
++|   3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f   ...........$..%.
++|   3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49   .THREADSAFE=0XBI
++|   3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41   NARY.#..%..THREA
++|   3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22   DSAFE=0XNOCASE..
++|   3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d   ..%..THREADSAFE=
++|   3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d   0XRTRIM.!..3..OM
++|   3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f   IT LOAD EXTENSIO
++|   3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 d3 19 4f   NXBINARY. ..3..O
++|   3200: 4d 49 54 28 2c 4f 41 44 b2 04 55 85 44 54 e5 34   MIT(,OAD..U.DT.4
++|   3216: 94 f4 e5 84 e4 f4 34 15 34 51 e1 f0 50 03 30 f1   ......4.4Q..P.0.
++|   3232: 74 f4 d4 95 42 04 c4 f4 14 42 04 55 85 44 54 e5   t...B....B.U.DT.
++|   3248: 34 94 f4 e5 85 25 45 24 94 d1 f1 e0 50 03 30 f1   4....%E$....P.0.
++|   3264: 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03   ......T..%..S...
++|   3280: 03 03 03 05 84 24 94 e4 15 25 91 f1 d0 50 03 30   .....$...%...P.0
++|   3296: f1 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03   .......T..%..S..
++|   3312: 03 03 03 03 05 84 e4 f4 34 15 34 51 e1 c0 50 03   ........4.4Q..P.
++|   3328: 30 f1 74 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03   0.t.....T..%..S.
++|   3344: 03 03 03 03 03 05 85 25 45 24 94 d1 81 b0 50 02   .......%E$....P.
++|   3360: 50 f1 94 54 e4 14 24 c4 52 05 25 45 24 54 55 84   P..T..$.R.%E$TU.
++|   3376: 24 94 e4 15 25 91 81 a0 50 02 50 f1 94 54 e4 14   $...%...P.P..T..
++|   3392: 24 c4 52 05 25 45 24 54 55 84 e4 f4 34 15 34 51   $.R.%E$TU...4.4Q
++|   3408: 71 90 50 02 50 f1 74 54 e4 14 24 c4 52 05 25 45   q.P.P.tT..$.R.%E
++|   3424: 24 54 55 85 25 45 24 94 d1 a1 80 50 02 90 f1 94   $TU.%E$....P....
++|   3440: 54 e4 14 24 c4 52 04 d4 54 d5 35 95 33 55 84 24   T..$.R..T.5.3U.$
++|   3456: 94 e4 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24   ...%..pP....T..$
++|   3472: c4 52 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34   .R..T.5.3U...4.4
++|   3488: 51 91 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4   Q.`P...tT..$.R..
++|   3504: 54 d5 35 95 33 55 85 25 45 24 94 d1 81 50 50 02   T.5.3U.%E$...PP.
++|   3520: 50 f1 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84   P..T..$.R..4....
++|   3536: 24 94 e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14   $...%[email protected]..
++|   3552: 24 c4 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51   $.R..4......4.4Q
++|   3568: 71 30 50 02 4f f1 74 54 e4 14 24 c4 52 04 a5 34   q0P.O.tT..$.R..4
++|   3584: f4 e3 15 85 25 45 24 94 d1 a1 20 50 02 90 f1 94   ....%E$... P....
++|   3600: 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24   T..$.R.tT......$
++|   3616: 94 e4 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24   ...%...P....T..$
++|   3632: c4 52 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34   .R.tT........4.4
++|   3648: 51 91 00 50 02 90 f1 74 54 e4 14 24 c4 51 f4 74   Q..P...tT..$.Q.t
++|   3664: 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02   T......%E$..p.P.
++|   3680: 30 f1 94 54 e4 14 24 c5 20 46 54 53 35 58 42 49   0..T..$. FTS5XBI
++|   3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c   NARY....#..ENABL
++|   3712: 45 20 46 54 53 35 58 4f 4f 43 41 53 45 16 0d 05   E FTS5XOOCASE...
++|   3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58   .#..ENABLE FTS5X
++|   3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42   RTRIM....#..ENAB
++|   3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 97 0b   LE FTS4XBINARY..
++|   3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34   ..#..ENABLE FTS4
++|   3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e   XNOCASE....#..EN
++|   3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e   ABLE FTS4XRTRIM.
++|   3824: 09 05 00 3e 5f 19 45 4e 41 42 4c 45 20 44 42 53   ...>_.ENABLE DBS
++|   3840: 44 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e   DAT VTABXBINARY.
++|   3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53   ...1..ENABLE DBS
++|   3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 4d e3 45 1d   TAT VTABXNOCM.E.
++|   3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53   ...1..ENABLE DBS
++|   3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06   TAT VTABXRTRIM..
++|   3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52   .....DEBUGXBINAR
++|   3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f   Y.......DEBUGXNO
++|   3952: 43 41 53 45 10 02 02 50 08 5f 17 44 45 42 55 47   CASE...P._.DEBUG
++|   3968: 58 52 54 52 49 4d 27 03 05 00 44 0f 19 43 4f 4d   XRTRIM'...D..COM
++|   3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20   PILER=gcc-5.4.0 
++|   4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27   20160609XBINARY'
++|   4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67   ...C..COMPILER=g
++|   4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30   cc-5.4.0 2016060
++|   4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 c9 17 43   9XNOCASE&...C..C
++|   4064: 4f 4d 50 49 4c 47 02 3d 67 63 63 2d 35 2e 34 2e   OMPILG.=gcc-5.4.
++|   4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d   0 20160609XRTRIM
++| page 6 offset 20480
++|      0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0   ....$...........
++|     16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0   ................
++|     32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60   .........x.p.h.`
++|     48: 0f 58 0f 50 0f 48 0f 40 0f 38 00 00 00 00 00 00   [email protected]......
++|   3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01   .$.......#......
++|   3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01   .........!......
++|   3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01   . ..............
++|   3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01   ................
++|   3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01   ................
++|   3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01   ................
++|   3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01   ................
++|   3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01   ................
++|   3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01   ................
++|   3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01   ................
++|   3968: 06 10 03 00 12 02 01 01 06 1f 03 00 12 02 01 01   ................
++|   3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01   ................
++|   4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01   ................
++|   4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01   ................
++|   4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01   ................
++|   4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01   ................
++|   4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01   ................
++|   4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01   ................
++| page 7 offset 24576
++|      0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00   ................
++|   4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04   ........version.
++| page 8 offset 28672
++|      0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
++|   4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72   .........+integr
++|   4064: 69 74 79 2d 63 68 65 63 6b 09 00 00 00 00 00 00   ity-check.......
++| end crash-31c462b8b665d0.db
++}]} {}
++
++
++do_catchsql_test 69.2 {
++  SELECT * FROM t1 WHERE a MATCH 'fx*'
++} {1 {database disk image is malformed}}
+ 
+ sqlite3_fts5_may_be_corrupt 0
+ finish_test
+--- /src/btree.c
++++ /src/btree.c
+@@ -3886,7 +3886,7 @@
+     Pgno nFree = get4byte(&pBt->pPage1->aData[36]);
+     Pgno nFin = finalDbSize(pBt, nOrig, nFree);
+ 
+-    if( nOrig<nFin ){
++    if( nOrig<nFin || nFree>=nOrig ){
+       rc = SQLITE_CORRUPT_BKPT;
+     }else if( nFree>0 ){
+       rc = saveAllCursors(pBt, 0, 0);
+@@ -8772,7 +8772,11 @@
+   assert( pPage->intKey || pX->nKey>=0 );
+   assert( pPage->leaf || !pPage->intKey );
+   if( pPage->nFree<0 ){
+-    rc = btreeComputeFreeSpace(pPage);
++    if( pCur->eState>CURSOR_INVALID ){
++      rc = SQLITE_CORRUPT_BKPT;
++    }else{
++      rc = btreeComputeFreeSpace(pPage);
++    }
+     if( rc ) return rc;
+   }
+ 
+--- /test/corruptL.test
++++ /test/corruptL.test
+@@ -1266,5 +1266,30 @@
+ do_execsql_test 15.1 {
+   UPDATE c1 SET c= NOT EXISTS(SELECT 1 FROM c1 ORDER BY (SELECT 1 FROM c1 
ORDER BY a)) +10 WHERE d BETWEEN 4 AND 7;
+ } {}
++
++#-------------------------------------------------------------------------
++reset_db
++do_execsql_test 16.0 {
++  CREATE TABLE t1(w, x, y, z, UNIQUE(w, x), UNIQUE(y, z));
++  INSERT INTO t1 VALUES(1, 1, 1, 1);
++
++  CREATE TABLE t1idx(x, y, i INTEGER, PRIMARY KEY(x)) WITHOUT ROWID;
++  INSERT INTO t1idx VALUES(10, NULL, 5);
++
++  PRAGMA writable_schema = 1;
++  UPDATE sqlite_master SET rootpage = (
++    SELECT rootpage FROM sqlite_master WHERE name='t1idx'
++  ) WHERE type = 'index';
++}
++
++db close
++sqlite3 db test.db
++
++do_catchsql_test 16.1 {
++  PRAGMA writable_schema = ON;
++  INSERT INTO t1(rowid, w, x, y, z) VALUES(5, 10, 11, 10, NULL);
++} {1 {database disk image is malformed}}
++
+ finish_test
+ 
++

diff --git a/dev-db/sqlite/files/sqlite-3.32.3-backports_3.patch 
b/dev-db/sqlite/files/sqlite-3.32.3-backports_3.patch
new file mode 100644
index 00000000000..07cb5d4a396
--- /dev/null
+++ b/dev-db/sqlite/files/sqlite-3.32.3-backports_3.patch
@@ -0,0 +1,220 @@
+https://sqlite.org/src/info/14eed318aa9e6e16
+https://sqlite.org/src/info/9679c0c61131f0e9
+https://sqlite.org/src/info/28515bbbae4fbc26
+https://sqlite.org/src/info/892e9191dc8f8056
+https://sqlite.org/src/info/270ac1a0f232d755
+
+--- /ext/fts3/fts3.c
++++ /ext/fts3/fts3.c
+@@ -5831,7 +5831,8 @@
+       fts3EvalRestart(pCsr, pRoot, &rc);
+       do {
+         fts3EvalNextRow(pCsr, pRoot, &rc);
+-        assert( pRoot->bEof==0 );
++        assert_fts3_nc( pRoot->bEof==0 );
++        if( pRoot->bEof ) rc = FTS_CORRUPT_VTAB;
+       }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK );
+     }
+   }
+--- /ext/misc/appendvfs.c
++++ /ext/misc/appendvfs.c
+@@ -439,7 +439,7 @@
+   p = (ApndFile*)pFile;
+   memset(p, 0, sizeof(*p));
+   pSubFile = ORIGFILE(pFile);
+-  p->base.pMethods = &apnd_io_methods;
++  pFile->pMethods = &apnd_io_methods;
+   rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
+   if( rc ) goto apnd_open_done;
+   rc = pSubFile->pMethods->xFileSize(pSubFile, &sz);
+--- /ext/misc/cksumvfs.c
++++ /ext/misc/cksumvfs.c
+@@ -634,7 +634,7 @@
+   p = (CksmFile*)pFile;
+   memset(p, 0, sizeof(*p));
+   pSubFile = ORIGFILE(pFile);
+-  p->base.pMethods = &cksm_io_methods;
++  pFile->pMethods = &cksm_io_methods;
+   rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
+   if( rc ) goto cksm_open_done;
+   if( flags & SQLITE_OPEN_WAL ){
+--- /src/date.c
++++ /src/date.c
+@@ -1112,8 +1112,8 @@
+         case 'm':  sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break;
+         case 'M':  sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break;
+         case 's': {
+-          sqlite3_snprintf(30,&z[j],"%lld",
+-                           (i64)(x.iJD/1000 - 21086676*(i64)10000));
++          i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000);
++          sqlite3Int64ToText(iS, &z[j]);
+           j += sqlite3Strlen30(&z[j]);
+           break;
+         }
+--- /src/memdb.c
++++ /src/memdb.c
+@@ -339,7 +339,7 @@
+   p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE;
+   assert( pOutFlags!=0 );  /* True because flags==SQLITE_OPEN_MAIN_DB */
+   *pOutFlags = flags | SQLITE_OPEN_MEMORY;
+-  p->base.pMethods = &memdb_io_methods;
++  pFile->pMethods = &memdb_io_methods;
+   p->szMax = sqlite3GlobalConfig.mxMemdbSize;
+   return SQLITE_OK;
+ }
+--- /src/memjournal.c
++++ /src/memjournal.c
+@@ -366,7 +366,7 @@
+     assert( MEMJOURNAL_DFLT_FILECHUNKSIZE==fileChunkSize(p->nChunkSize) );
+   }
+ 
+-  p->pMethod = (const sqlite3_io_methods*)&MemJournalMethods;
++  pJfd->pMethods = (const sqlite3_io_methods*)&MemJournalMethods;
+   p->nSpill = nSpill;
+   p->flags = flags;
+   p->zJournal = zName;
+@@ -392,7 +392,7 @@
+ int sqlite3JournalCreate(sqlite3_file *pJfd){
+   int rc = SQLITE_OK;
+   MemJournal *p = (MemJournal*)pJfd;
+-  if( p->pMethod==&MemJournalMethods && (
++  if( pJfd->pMethods==&MemJournalMethods && (
+ #ifdef SQLITE_ENABLE_ATOMIC_WRITE
+      p->nSpill>0
+ #else
+--- /src/os_unix.c
++++ /src/os_unix.c
+@@ -5689,7 +5689,7 @@
+   if( rc!=SQLITE_OK ){
+     if( h>=0 ) robust_close(pNew, h, __LINE__);
+   }else{
+-    pNew->pMethod = pLockingStyle;
++    pId->pMethods = pLockingStyle;
+     OpenCounter(+1);
+     verifyDbFile(pNew);
+   }
+--- /src/os_win.c
++++ /src/os_win.c
+@@ -5266,7 +5266,7 @@
+   }
+ 
+   sqlite3_free(zTmpname);
+-  pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod;
++  id->pMethods = pAppData ? pAppData->pMethod : &winIoMethod;
+   pFile->pVfs = pVfs;
+   pFile->h = h;
+   if( isReadonly ){
+--- /src/sqliteInt.h
++++ /src/sqliteInt.h
+@@ -4437,6 +4437,7 @@
+ int sqlite3FixExprList(DbFixer*, ExprList*);
+ int sqlite3FixTriggerStep(DbFixer*, TriggerStep*);
+ int sqlite3RealSameAsInt(double,sqlite3_int64);
++void sqlite3Int64ToText(i64,char*);
+ int sqlite3AtoF(const char *z, double*, int, u8);
+ int sqlite3GetInt32(const char *, int*);
+ int sqlite3Atoi(const char*);
+--- /src/test_multiplex.c
++++ /src/test_multiplex.c
+@@ -591,9 +591,9 @@
+ 
+     if( rc==SQLITE_OK ){
+       if( pSubOpen->pMethods->iVersion==1 ){
+-        pMultiplexOpen->base.pMethods = &gMultiplex.sIoMethodsV1;
++        pConn->pMethods = &gMultiplex.sIoMethodsV1;
+       }else{
+-        pMultiplexOpen->base.pMethods = &gMultiplex.sIoMethodsV2;
++        pConn->pMethods = &gMultiplex.sIoMethodsV2;
+       }
+     }else{
+       multiplexFreeComponents(pGroup);
+--- /src/util.c
++++ /src/util.c
+@@ -596,6 +596,30 @@
+ #endif
+ 
+ /*
++** Render an signed 64-bit integer as text.  Store the result in zOut[].
++**
++** The caller must ensure that zOut[] is at least 21 bytes in size.
++*/
++void sqlite3Int64ToText(i64 v, char *zOut){
++  int i;
++  u64 x;
++  char zTemp[22];
++  if( v<0 ){
++    x = (v==SMALLEST_INT64) ? ((u64)1)<<63 : -v;
++  }else{
++    x = v;
++  }
++  i = sizeof(zTemp)-2;
++  zTemp[sizeof(zTemp)-1] = 0;
++  do{
++    zTemp[i--] = (x%10) + '0';
++    x = x/10;
++  }while( x );
++  if( v<0 ) zTemp[i--] = '-';
++  memcpy(zOut, &zTemp[i+1], sizeof(zTemp)-1-i);
++}
++
++/*
+ ** Compare the 19-character string zNum against the text representation
+ ** value 2^63:  9223372036854775808.  Return negative, zero, or positive
+ ** if zNum is less than, equal to, or greater than the string.
+--- /src/vdbemem.c
++++ /src/vdbemem.c
+@@ -104,16 +104,25 @@
+ static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){
+   StrAccum acc;
+   assert( p->flags & (MEM_Int|MEM_Real|MEM_IntReal) );
+-  sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0);
++  assert( sz>22 );
+   if( p->flags & MEM_Int ){
+-    sqlite3_str_appendf(&acc, "%lld", p->u.i);
+-  }else if( p->flags & MEM_IntReal ){
+-    sqlite3_str_appendf(&acc, "%!.15g", (double)p->u.i);
++#if GCC_VERSION>=7000000
++    /* Work-around for GCC bug
++    ** https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96270 */
++    i64 x;
++    assert( (p->flags&MEM_Int)*2==sizeof(x) );
++    memcpy(&x, (char*)&p->u, (p->flags&MEM_Int)*2);
++    sqlite3Int64ToText(x, zBuf);
++#else
++    sqlite3Int64ToText(p->u.i, zBuf);
++#endif
+   }else{
+-    sqlite3_str_appendf(&acc, "%!.15g", p->u.r);
++    sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0);
++    sqlite3_str_appendf(&acc, "%!.15g", 
++         (p->flags & MEM_IntReal)!=0 ? (double)p->u.i : p->u.r);
++    assert( acc.zText==zBuf && acc.mxAlloc<=0 );
++    zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */
+   }
+-  assert( acc.zText==zBuf && acc.mxAlloc<=0 );
+-  zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */
+ }
+ 
+ #ifdef SQLITE_DEBUG
+--- /test/fts3corrupt4.test
++++ /test/fts3corrupt4.test
+@@ -6282,4 +6282,19 @@
+ 
+ set sqlite_fts3_enable_parentheses $saved
+ 
++#-------------------------------------------------------------------------
++reset_db
++do_execsql_test 47.1 {
++  CREATE VIRTUAL TABLE t1 USING fts3(a,b,c);
++}
++do_execsql_test 47.2 {
++  INSERT INTO t1_segdir 
VALUES(0,0,0,0,0,X'000130120106000106000106001f030001030001030000083230313630363039090107000107000107000001340901050001050001050000013509010400010400010400010730303030303030091c0400010400010400000662696e6172793c0301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000008636f6d70696c657209010200010200010200000664627374617409070300010300010300010465627567090402000102000102000006656e61626c653f07020001020001020001020001020001020001020001020001020001020001020001020001010001020001020001020001020001020001020001020001020001087874656e73696f6e091f0400010400010400000466747334090a0300010300010300030135090d03000103000103000003676363090103000103000103000106656f706f6c790910030001030001030000056a736f6e310913030001030001030000046c6f6164091f030001030001030000036d6178091c02000102000102000105656d6f7279091c03000103000103000304737973350916030001030001030000066e6f636173653c020102020003010202000301020200030102020003010
 
20200030102020003010202000301020200030102020003010202000301020200030102020000046f6d6974091f020001020001020000057274726565091903000103000103000302696d3c01010202000301020200030102020003010202000301020200030102020003010202000301a202000301020200030102020003010202000301020200000a746872656164736166650922020001020001020000047674616209070400010400010400000178b401010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200');
++  INSERT INTO t1_segdir 
VALUES(0,1,0,0,0,X'0001300425061b000008323031363036303903250700000134032505000001350325040001073030303030303003251a000008636f6d70696c657203250200000664627374617403250a00010465627567032508000006656e61626c650925090504040404040001087874656e73696f6e03251d0000046674733403250d0003013503250f000003676363032503000106656f706f6c790325110000056a736f6e310325130000046c6f616403251c0000036d6178032518000105656d6f7279032519000304737973350325150000046f6d697403251b000005727472656503251700000a7468726561647361666503251e0000047674616333250b00');
++}
++
++do_catchsql_test 47.3 {
++  SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH '"json1 enable"';
++} {1 {database disk image is malformed}}
++
++
+ finish_test

diff --git a/dev-db/sqlite/sqlite-3.32.3-r1.ebuild 
b/dev-db/sqlite/sqlite-3.32.3-r1.ebuild
new file mode 100644
index 00000000000..78ff6e09570
--- /dev/null
+++ b/dev-db/sqlite/sqlite-3.32.3-r1.ebuild
@@ -0,0 +1,339 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI="7"
+
+inherit autotools flag-o-matic multilib-minimal toolchain-funcs
+
+if [[ "${PV}" != "9999" ]]; then
+       SRC_PV="$(printf "%u%02u%02u%02u" $(ver_rs 1- " "))"
+       DOC_PV="${SRC_PV}"
+       # DOC_PV="$(printf "%u%02u%02u00" $(ver_rs 1-3 " "))"
+fi
+
+DESCRIPTION="SQL database engine"
+HOMEPAGE="https://sqlite.org/";
+if [[ "${PV}" == "9999" ]]; then
+       SRC_URI=""
+else
+       SRC_URI="https://sqlite.org/2020/${PN}-src-${SRC_PV}.zip
+               doc? ( https://sqlite.org/2020/${PN}-doc-${DOC_PV}.zip )"
+fi
+
+LICENSE="public-domain"
+SLOT="3"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv 
~s390 ~sparc ~x86 ~ppc-aix ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos 
~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris 
~x86-solaris"
+IUSE="debug doc icu +readline secure-delete static-libs tcl test tools"
+if [[ "${PV}" == "9999" ]]; then
+       PROPERTIES="live"
+fi
+RESTRICT="!test? ( test )"
+
+if [[ "${PV}" == "9999" ]]; then
+       BDEPEND=">=dev-lang/tcl-8.6:0
+               dev-vcs/fossil"
+else
+       BDEPEND="app-arch/unzip
+               >=dev-lang/tcl-8.6:0"
+fi
+RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}]
+       icu? ( dev-libs/icu:0=[${MULTILIB_USEDEP}] )
+       readline? ( sys-libs/readline:0=[${MULTILIB_USEDEP}] )
+       tcl? ( dev-lang/tcl:0=[${MULTILIB_USEDEP}] )
+       tools? ( dev-lang/tcl:0=[${MULTILIB_USEDEP}] )"
+DEPEND="${RDEPEND}
+       test? ( >=dev-lang/tcl-8.6:0[${MULTILIB_USEDEP}] )"
+
+if [[ "${PV}" == "9999" ]]; then
+       S="${WORKDIR}/${PN}"
+else
+       S="${WORKDIR}/${PN}-src-${SRC_PV}"
+fi
+
+src_unpack() {
+       if [[ "${PV}" == "9999" ]]; then
+               local distdir="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}"
+               addwrite "${distdir}"
+               mkdir -p "${distdir}/fossil-src/${PN}" || die
+
+               mkdir "${WORKDIR}/${PN}" || die
+               pushd "${WORKDIR}/${PN}" > /dev/null || die
+               if [[ ! -f "${distdir}/fossil-src/${PN}/sqlite.fossil" ]]; then
+                       einfo fossil clone --verbose https://sqlite.org/src 
sqlite.fossil
+                       fossil clone --verbose https://sqlite.org/src 
sqlite.fossil || die
+                       echo
+               else
+                       cp -p "${distdir}/fossil-src/${PN}/sqlite.fossil" . || 
die
+                       einfo fossil pull --repository sqlite.fossil --verbose 
https://sqlite.org/src
+                       fossil pull --repository sqlite.fossil --verbose 
https://sqlite.org/src || die
+                       echo
+               fi
+               cp -p sqlite.fossil "${distdir}/fossil-src/${PN}" || die
+               einfo fossil open --quiet sqlite.fossil
+               fossil open --quiet sqlite.fossil || die
+               echo
+               popd > /dev/null || die
+
+               if use doc; then
+                       mkdir "${WORKDIR}/${PN}-doc" || die
+                       pushd "${WORKDIR}/${PN}-doc" > /dev/null || die
+                       if [[ ! -f 
"${distdir}/fossil-src/${PN}/sqlite-doc.fossil" ]]; then
+                               einfo fossil clone --verbose 
https://sqlite.org/docsrc sqlite-doc.fossil
+                               fossil clone --verbose 
https://sqlite.org/docsrc sqlite-doc.fossil || die
+                               echo
+                       else
+                               cp -p 
"${distdir}/fossil-src/${PN}/sqlite-doc.fossil" . || die
+                               einfo fossil pull --repository 
sqlite-doc.fossil --verbose https://sqlite.org/docsrc
+                               fossil pull --repository sqlite-doc.fossil 
--verbose https://sqlite.org/docsrc || die
+                               echo
+                       fi
+                       cp -p sqlite-doc.fossil "${distdir}/fossil-src/${PN}" 
|| die
+                       einfo fossil open --quiet sqlite-doc.fossil
+                       fossil open --quiet sqlite-doc.fossil || die
+                       echo
+                       popd > /dev/null || die
+               fi
+       else
+               default
+       fi
+}
+
+src_prepare() {
+       eapply "${FILESDIR}/"${PN}-3.32.1-full_archive-build_{1,2}.patch
+       eapply "${FILESDIR}/"${PN}-3.32.3-backports_{1,2,3}.patch
+
+       eapply_user
+
+       # Fix AC_CHECK_FUNCS.
+       # 
https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html
+       sed -e "s/AC_CHECK_FUNCS(.*)/AC_CHECK_FUNCS([fdatasync fullfsync 
gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread 
pread64 pwrite pwrite64 strchrnul usleep utime])/" -i configure.ac || die "sed 
failed"
+
+       eautoreconf
+
+       multilib_copy_sources
+}
+
+multilib_src_configure() {
+       local -x CPPFLAGS="${CPPFLAGS}" CFLAGS="${CFLAGS}"
+       local options=()
+
+       options+=(
+               --enable-load-extension
+               --enable-threadsafe
+       )
+
+       # Support detection of misuse of SQLite API.
+       # https://sqlite.org/compile.html#enable_api_armor
+       append-cppflags -DSQLITE_ENABLE_API_ARMOR
+
+       # Support bytecode and tables_used virtual tables.
+       # https://sqlite.org/bytecodevtab.html
+       append-cppflags -DSQLITE_ENABLE_BYTECODE_VTAB
+
+       # Support column metadata functions.
+       # https://sqlite.org/c3ref/column_database_name.html
+       append-cppflags -DSQLITE_ENABLE_COLUMN_METADATA
+
+       # Support sqlite_dbpage virtual table.
+       # https://sqlite.org/dbpage.html
+       append-cppflags -DSQLITE_ENABLE_DBPAGE_VTAB
+
+       # Support dbstat virtual table.
+       # https://sqlite.org/dbstat.html
+       append-cppflags -DSQLITE_ENABLE_DBSTAT_VTAB
+
+       # Support sqlite3_serialize() and sqlite3_deserialize() functions.
+       # https://sqlite.org/c3ref/serialize.html
+       # https://sqlite.org/c3ref/deserialize.html
+       append-cppflags -DSQLITE_ENABLE_DESERIALIZE
+
+       # Support comments in output of EXPLAIN.
+       # https://sqlite.org/compile.html#enable_explain_comments
+       append-cppflags -DSQLITE_ENABLE_EXPLAIN_COMMENTS
+
+       # Support Full-Text Search versions 3, 4 and 5.
+       # https://sqlite.org/fts3.html
+       # https://sqlite.org/fts5.html
+       append-cppflags -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS 
-DSQLITE_ENABLE_FTS4
+       options+=(--enable-fts5)
+
+       # Support hidden columns.
+       append-cppflags -DSQLITE_ENABLE_HIDDEN_COLUMNS
+
+       # Support JSON1 extension.
+       # https://sqlite.org/json1.html
+       append-cppflags -DSQLITE_ENABLE_JSON1
+
+       # Support memsys5 memory allocator.
+       # https://sqlite.org/malloc.html#memsys5
+       append-cppflags -DSQLITE_ENABLE_MEMSYS5
+
+       # Support sqlite3_normalized_sql() function.
+       # https://sqlite.org/c3ref/expanded_sql.html
+       append-cppflags -DSQLITE_ENABLE_NORMALIZE
+
+       # Support sqlite_offset() function.
+       # https://sqlite.org/lang_corefunc.html#sqlite_offset
+       append-cppflags -DSQLITE_ENABLE_OFFSET_SQL_FUNC
+
+       # Support pre-update hook functions.
+       # https://sqlite.org/c3ref/preupdate_count.html
+       append-cppflags -DSQLITE_ENABLE_PREUPDATE_HOOK
+
+       # Support Resumable Bulk Update extension.
+       # https://sqlite.org/rbu.html
+       append-cppflags -DSQLITE_ENABLE_RBU
+
+       # Support R*Trees.
+       # https://sqlite.org/rtree.html
+       # https://sqlite.org/geopoly.html
+       append-cppflags -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY
+
+       # Support scan status functions.
+       # https://sqlite.org/c3ref/stmt_scanstatus.html
+       # https://sqlite.org/c3ref/stmt_scanstatus_reset.html
+       append-cppflags -DSQLITE_ENABLE_STMT_SCANSTATUS
+
+       # Support sqlite_stmt virtual table.
+       # https://sqlite.org/stmt.html
+       append-cppflags -DSQLITE_ENABLE_STMTVTAB
+
+       # Support Session extension.
+       # https://sqlite.org/sessionintro.html
+       options+=(--enable-session)
+
+       # Support unknown() function.
+       # https://sqlite.org/compile.html#enable_unknown_sql_function
+       append-cppflags -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
+
+       # Support unlock notification.
+       # https://sqlite.org/unlock_notify.html
+       append-cppflags -DSQLITE_ENABLE_UNLOCK_NOTIFY
+
+       # Support LIMIT and ORDER BY clauses on DELETE and UPDATE statements.
+       # 
https://sqlite.org/lang_delete.html#optional_limit_and_order_by_clauses
+       # 
https://sqlite.org/lang_update.html#optional_limit_and_order_by_clauses
+       append-cppflags -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT
+
+       # Support soundex() function.
+       # https://sqlite.org/lang_corefunc.html#soundex
+       append-cppflags -DSQLITE_SOUNDEX
+
+       # Support URI filenames.
+       # https://sqlite.org/uri.html
+       append-cppflags -DSQLITE_USE_URI
+
+       # debug USE flag.
+       options+=($(use_enable debug))
+
+       # icu USE flag.
+       if use icu; then
+               # Support ICU extension.
+               # https://sqlite.org/compile.html#enable_icu
+               append-cppflags -DSQLITE_ENABLE_ICU
+               sed -e "s/^TLIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in 
|| die "sed failed"
+       fi
+
+       # readline USE flag.
+       options+=(
+               --disable-editline
+               $(use_enable readline)
+       )
+       if use readline; then
+               
options+=(--with-readline-inc="-I${ESYSROOT}/usr/include/readline")
+       fi
+
+       # secure-delete USE flag.
+       if use secure-delete; then
+               # Enable secure_delete pragma by default.
+               # https://sqlite.org/pragma.html#pragma_secure_delete
+               append-cppflags -DSQLITE_SECURE_DELETE
+       fi
+
+       # static-libs USE flag.
+       options+=($(use_enable static-libs static))
+
+       # tcl, test, tools USE flags.
+       options+=(--enable-tcl)
+
+       if [[ "${CHOST}" == *-mint* ]]; then
+               append-cppflags -DSQLITE_OMIT_WAL
+       fi
+
+       if [[ "${ABI}" == "x86" ]]; then
+               if $(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P -dM - < /dev/null 2> 
/dev/null | grep -q "^#define __SSE__ 1$"; then
+                       append-cflags -mfpmath=sse
+               else
+                       append-cflags -ffloat-store
+               fi
+       fi
+
+       econf "${options[@]}"
+}
+
+multilib_src_compile() {
+       emake HAVE_TCL="$(usex tcl 1 "")" 
TCLLIBDIR="${EPREFIX}/usr/$(get_libdir)/${P}"
+
+       if use tools && multilib_is_native_abi; then
+               emake changeset dbdump dbhash dbtotxt index_usage rbu scrub 
showdb showjournal showshm showstat4 showwal sqldiff sqlite3_analyzer 
sqlite3_checker sqlite3_expert sqltclsh
+       fi
+}
+
+multilib_src_test() {
+       if [[ "${EUID}" -eq 0 ]]; then
+               ewarn "Skipping tests due to root permissions"
+               return
+       fi
+
+       local -x SQLITE_HISTORY="${T}/sqlite_history_${ABI}"
+
+       emake HAVE_TCL="$(usex tcl 1 "")" $(use debug && echo fulltest || echo 
test)
+}
+
+multilib_src_install() {
+       emake DESTDIR="${D}" HAVE_TCL="$(usex tcl 1 "")" 
TCLLIBDIR="${EPREFIX}/usr/$(get_libdir)/${P}" install
+
+       if use tools && multilib_is_native_abi; then
+               install_tool() {
+                       if [[ -f ".libs/${1}" ]]; then
+                               newbin ".libs/${1}" "${2}"
+                       else
+                               newbin "${1}" "${2}"
+                       fi
+               }
+
+               install_tool changeset sqlite3-changeset
+               install_tool dbdump sqlite3-db-dump
+               install_tool dbhash sqlite3-db-hash
+               install_tool dbtotxt sqlite3-db-to-txt
+               install_tool index_usage sqlite3-index-usage
+               install_tool rbu sqlite3-rbu
+               install_tool scrub sqlite3-scrub
+               install_tool showdb sqlite3-show-db
+               install_tool showjournal sqlite3-show-journal
+               install_tool showshm sqlite3-show-shm
+               install_tool showstat4 sqlite3-show-stat4
+               install_tool showwal sqlite3-show-wal
+               install_tool sqldiff sqlite3-diff
+               install_tool sqlite3_analyzer sqlite3-analyzer
+               install_tool sqlite3_checker sqlite3-checker
+               install_tool sqlite3_expert sqlite3-expert
+               install_tool sqltclsh sqlite3-tclsh
+
+               unset -f install_tool
+       fi
+}
+
+multilib_src_install_all() {
+       find "${D}" -name "*.la" -type f -delete || die
+
+       doman sqlite3.1
+
+       if use doc; then
+               rm "${WORKDIR}/${PN}-doc-${DOC_PV}/"*.{db,txt} || die
+               (
+                       docinto html
+                       dodoc -r "${WORKDIR}/${PN}-doc-${DOC_PV}/"*
+               )
+       fi
+}

Reply via email to