Source: sqlite3
Severity: critical
Tags: patch
Justification: breaks unrelated software
User: debian-s...@lists.debian.org
Usertags: s390x

Hi!

Due to a regression in sqlite3, git has been failing to build from source
on multiple big-endian targets, including the release target s390x [1].

openSUSE has recently cherry-picked two upstream commits which address
this issue [2, 3, 4] and I have verified that these patches fix git
in Debian on ppc64 (and I assume s390x and sparc64 as well). Thus, please
include these patches to unbreak git on ppc64, sparc64 and s390x.

Severity set to 'critical' as this bug breaks unrelated software.

Attaching the two patches taken from openSUSE.

Thanks,
Adrian

> [1] https://marc.info/?l=git&m=158120991004802&w=2
> [2] 
> https://build.opensuse.org/package/rdiff/server:database/sqlite3?linkrev=base&rev=241
> [3] https://sqlite.org/src/info/04885763c4cd00cb
> [4] https://sqlite.org/src/info/b20503aaf5b6595a

--
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer - glaub...@debian.org
`. `'   Freie Universitaet Berlin - glaub...@physik.fu-berlin.de
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
Index: ext/fts5/test/fts5matchinfo.test
==================================================================
--- ext/fts5/test/fts5matchinfo.test
+++ ext/fts5/test/fts5matchinfo.test
@@ -498,23 +498,26 @@
   CREATE VIRTUAL TABLE t1 USING fts5(x, y);
   INSERT INTO t1 VALUES('a', 'b');
   INSERT INTO t1 VALUES('c', 'd');
 }
 
+if {$tcl_platform(byteOrder)=="littleEndian"} {
+  set res {X'02000000'}
+} else {
+  set res {X'00000002'}
+}
 do_execsql_test 15.1 {
   SELECT quote(matchinfo(t1, 'n')) FROM t1 LIMIT 1;
-} {X'02000000'}
-
+} $res
 do_execsql_test 15.2 {
   DELETE FROM t1_content WHERE rowid=1;
   SELECT quote(matchinfo(t1, 'n')) FROM t1 LIMIT 1;
-} {X'02000000'}
+} $res
 
 fts5_aux_test_functions db
 do_execsql_test 15.3 {
   SELECT fts5_test_all(t1) FROM t1 LIMIT 1;
 } {
   {columnsize {0 0} columntext {c d} columntotalsize {2 2} poslist {} tokenize 
{c d} rowcount 2}
 }
 
 finish_test
-

Index: test/fts4aa.test
==================================================================
--- test/fts4aa.test
+++ test/fts4aa.test
@@ -227,17 +227,22 @@
 } {1 {database disk image is malformed}}
 
 # 2019-11-18 https://bugs.chromium.org/p/chromium/issues/detail?id=1025467
 db close
 sqlite3 db :memory:
+if {$tcl_platform(byteOrder)=="littleEndian"} {
+  set res 
{X'0200000000000000000000000E0000000E00000001000000010000000100000001000000'}
+} else {
+  set res 
{X'0000000200000000000000000000000E0000000E00000001000000010000000100000001'}
+}
 do_execsql_test fts4aa-6.10 {
   CREATE VIRTUAL TABLE f USING fts4();
   INSERT INTO f_segdir VALUES (77,91,0,0,'255 
77',x'0001308000004d5c4ddddddd4d4d7b4d4d4d614d8019ff4d05000001204d4d2e4d6e4d4d4d4b4d6c4d004d4d4d4d4d4d3d000000004d5d4d4d645d4d004d4d4d4d4d4d4d4d4d454d6910004d05ffff054d646c4d004d5d4d4d4d4d3d000000004d4d4d4d4d4d4d4d4d4d4d69624d4d4d04004d4d4d4d4d604d4ce1404d554d45');
   INSERT INTO f_segdir VALUES (77,108,0,0,'255 
77',x'0001310000fa64004d4d4d3c5d4d654d4d4d614d8000ff4d05000001204d4d2e4d6e4d4d4dff4d4d4d4d4d4d00104d4d4d4d000000004d4d4d0400311d4d4d4d4d4d4d4d4d4d684d6910004d05ffff054d4d6c4d004d4d4d4d4d4d3d000000004d4d4d4d644d4d4d4d4d4d69624d4d4d03ed4d4d4d4d4d604d4ce1404d550080');
   INSERT INTO f_stat VALUES 
(0,x'80808080100000000064004d4d4d3c4d4d654d4d4d614d8000ff4df6ff1a00204d4d2e4d6e4d4d4d104d4d4d4d4d4d00104d4d4d4d4d4d69574d4d4d000031044d4d4d3e4d4d4c4d05004d6910');
   SELECT quote(matchinfo(f,'pnax')) from f where f match '0 1';
-} {X'0200000000000000000000000E0000000E00000001000000010000000100000001000000'}
+} $res
 
 # 2019-11-18 Detect infinite loop in fts3SelectLeaf()
 db close
 sqlite3 db :memory:
 do_catchsql_test fts4aa-7.10 {

Index: src/insert.c
==================================================================
--- src/insert.c
+++ src/insert.c
@@ -2168,16 +2168,18 @@
             ** Hence, make a complete copy of the opcode, rather than using
             ** a pointer to the opcode. */
             x = *sqlite3VdbeGetOp(v, addrConflictCk);
             if( x.opcode!=OP_IdxRowid ){
               int p2;      /* New P2 value for copied conflict check opcode */
+              const char *zP4;
               if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){
                 p2 = lblRecheckOk;
               }else{
                 p2 = x.p2;
               }
-              sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, x.p4.z, x.p4type);
+              zP4 = x.p4type==P4_INT32 ? SQLITE_INT_TO_PTR(x.p4.i) : x.p4.z;
+              sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, zP4, x.p4type);
               sqlite3VdbeChangeP5(v, x.p5);
               VdbeCoverageIf(v, p2!=x.p2);
             }
             nConflictCk--;
             addrConflictCk++;

Reply via email to