diff --git a/548082dfab-Improvements-to-the-LEFT-JOIN.patch b/548082dfab-Improvements-to-the-LEFT-JOIN.patch new file mode 100644 index 0000000..0399157 --- /dev/null +++ b/548082dfab-Improvements-to-the-LEFT-JOIN.patch @@ -0,0 +1,23 @@ +Index: src/expr.c +================================================================== +--- src/expr.c ++++ src/expr.c +@@ -5229,12 +5229,16 @@ + ** ordinary join. + */ + int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ + Walker w; + p = sqlite3ExprSkipCollateAndLikely(p); +- if( p && p->op==TK_NOTNULL ){ ++ if( p==0 ) return 0; ++ if( p->op==TK_NOTNULL ){ + p = p->pLeft; ++ }else if( p->op==TK_AND ){ ++ if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; ++ p = p->pRight; + } + w.xExprCallback = impliesNotNullRow; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + w.eCode = 0; + diff --git a/7833feecfe-Prevent-SQLite-from-bad-NULL-assumption.patch b/7833feecfe-Prevent-SQLite-from-bad-NULL-assumption.patch new file mode 100644 index 0000000..d7bc71f --- /dev/null +++ b/7833feecfe-Prevent-SQLite-from-bad-NULL-assumption.patch @@ -0,0 +1,91 @@ +Index: src/expr.c +================================================================== +--- src/expr.c ++++ src/expr.c +@@ -5166,14 +5166,15 @@ + return WRC_Abort; + } + return WRC_Prune; + + case TK_AND: +- if( sqlite3ExprImpliesNonNullRow(pExpr->pLeft, pWalker->u.iCur) +- && sqlite3ExprImpliesNonNullRow(pExpr->pRight, pWalker->u.iCur) +- ){ +- pWalker->eCode = 1; ++ assert( pWalker->eCode==0 ); ++ sqlite3WalkExpr(pWalker, pExpr->pLeft); ++ if( pWalker->eCode ){ ++ pWalker->eCode = 0; ++ sqlite3WalkExpr(pWalker, pExpr->pRight); + } + return WRC_Prune; + + case TK_BETWEEN: + sqlite3WalkExpr(pWalker, pExpr->pLeft); +@@ -5228,19 +5229,12 @@ + ** ordinary join. + */ + int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ + Walker w; + p = sqlite3ExprSkipCollateAndLikely(p); +- while( p ){ +- if( p->op==TK_NOTNULL ){ +- p = p->pLeft; +- }else if( p->op==TK_AND ){ +- if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; +- p = p->pRight; +- }else{ +- break; +- } ++ if( p && p->op==TK_NOTNULL ){ ++ p = p->pLeft; + } + w.xExprCallback = impliesNotNullRow; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + w.eCode = 0; + +Index: test/join.test +================================================================== +--- test/join.test ++++ test/join.test +@@ -902,8 +902,38 @@ + } {1 {}} + + do_execsql_test join-18.4 { + SELECT NOT(v0.a IS FALSE) FROM v0 + } {1} ++ ++#------------------------------------------------------------------------- ++reset_db ++do_execsql_test join-19.0 { ++ CREATE TABLE t1(a); ++ CREATE TABLE t2(b); ++ INSERT INTO t1(a) VALUES(0); ++ CREATE VIEW v0(c) AS SELECT t2.b FROM t1 LEFT JOIN t2; ++} ++ ++do_execsql_test join-19.1 { ++ SELECT * FROM v0 WHERE v0.c NOTNULL NOTNULL; ++} {{}} ++ ++do_execsql_test join-19.2 { ++ SELECT * FROM t1 LEFT JOIN t2 ++} {0 {}} ++ ++do_execsql_test join-19.3 { ++ SELECT * FROM t1 LEFT JOIN t2 WHERE (b IS NOT NULL) IS NOT NULL; ++} {0 {}} ++ ++do_execsql_test join-19.4 { ++ SELECT (b IS NOT NULL) IS NOT NULL FROM t1 LEFT JOIN t2 ++} {1} ++ ++do_execsql_test join-19.5 { ++ SELECT * FROM t1 LEFT JOIN t2 WHERE ++ (b IS NOT NULL AND b IS NOT NULL) IS NOT NULL; ++} {0 {}} + + finish_test + + diff --git a/8a39167bd2-Further-improvements-to-LEFT-JOIN.patch b/8a39167bd2-Further-improvements-to-LEFT-JOIN.patch new file mode 100644 index 0000000..571993f --- /dev/null +++ b/8a39167bd2-Further-improvements-to-LEFT-JOIN.patch @@ -0,0 +1,24 @@ +Index: src/expr.c +================================================================== +--- src/expr.c ++++ src/expr.c +@@ -5232,13 +5232,15 @@ + Walker w; + p = sqlite3ExprSkipCollateAndLikely(p); + if( p==0 ) return 0; + if( p->op==TK_NOTNULL ){ + p = p->pLeft; +- }else if( p->op==TK_AND ){ +- if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; +- p = p->pRight; ++ }else{ ++ while( p->op==TK_AND ){ ++ if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; ++ p = p->pRight; ++ } + } + w.xExprCallback = impliesNotNullRow; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + w.eCode = 0; + diff --git a/fix_dir_exists_on_btrfs.patch b/fix_dir_exists_on_btrfs.patch new file mode 100644 index 0000000..062ec1c --- /dev/null +++ b/fix_dir_exists_on_btrfs.patch @@ -0,0 +1,12 @@ +--- src/os_unix.c_orig 2019-12-26 00:56:55.810897741 +0100 ++++ src/os_unix.c 2019-12-26 00:59:29.904449135 +0100 +@@ -6259,7 +6259,8 @@ + + if( flags==SQLITE_ACCESS_EXISTS ){ + struct stat buf; +- *pResOut = (0==osStat(zPath, &buf) && buf.st_size>0); ++ *pResOut = (0==osStat(zPath, &buf) && ++ ((buf.st_size>0) || S_ISDIR(buf.st_mode))); + }else{ + *pResOut = osAccess(zPath, W_OK|R_OK)==0; + } diff --git a/sqlite-doc-3290000.zip b/sqlite-doc-3290000.zip deleted file mode 100644 index c5993cb..0000000 --- a/sqlite-doc-3290000.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fb9cc6d1f29560300692029089ca1d2feb7c397df6f6eb4c2998856d3bc2929 -size 9415641 diff --git a/sqlite-doc-3300100.zip b/sqlite-doc-3300100.zip new file mode 100644 index 0000000..ef0cb7c --- /dev/null +++ b/sqlite-doc-3300100.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10f585ad8c631c47187510a895944ac47e8f6f23b1171aebc8f8ce6c0c650415 +size 9485342 diff --git a/sqlite-src-3290000.zip b/sqlite-src-3290000.zip deleted file mode 100644 index 1ec07ba..0000000 --- a/sqlite-src-3290000.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1533d97504e969ca766da8ff393e71edd70798564813fc2620b0708944c8817 -size 12557725 diff --git a/sqlite-src-3300100.zip b/sqlite-src-3300100.zip new file mode 100644 index 0000000..974081e --- /dev/null +++ b/sqlite-src-3300100.zip @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4690370737189149c9e8344414aa371f89a70e3744ba317cef1a49fb0ee81ce1 +size 12648162 diff --git a/sqlite3-CVE-2019-16168.patch b/sqlite3-CVE-2019-16168.patch deleted file mode 100644 index c584e2d..0000000 --- a/sqlite3-CVE-2019-16168.patch +++ /dev/null @@ -1,46 +0,0 @@ ---- src/analyze.c.orig -+++ src/analyze.c -@@ -1497,7 +1497,9 @@ static void decodeIntArray( - if( sqlite3_strglob("unordered*", z)==0 ){ - pIndex->bUnordered = 1; - }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){ -- pIndex->szIdxRow = sqlite3LogEst(sqlite3Atoi(z+3)); -+ int sz = sqlite3Atoi(z+3); -+ if( sz<2 ) sz = 2; -+ pIndex->szIdxRow = sqlite3LogEst(sz); - }else if( sqlite3_strglob("noskipscan*", z)==0 ){ - pIndex->noSkipScan = 1; - } ---- src/where.c.orig -+++ src/where.c -@@ -2668,6 +2668,7 @@ static int whereLoopAddBtreeIndex( - ** it to pNew->rRun, which is currently set to the cost of the index - ** seek only. Then, if this is a non-covering index, add the cost of - ** visiting the rows in the main table. */ -+ assert( pSrc->pTab->szTabRow>0 ); - rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; - pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); - if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){ ---- test/analyzeC.test.orig -+++ test/analyzeC.test -@@ -132,6 +132,20 @@ do_execsql_test 4.3 { - SELECT count(a) FROM t1; - } {/.*INDEX t1ca.*/} - -+# 2019-08-15. -+# Ticket https://www.sqlite.org/src/tktview/e4598ecbdd18bd82945f602901 -+# The sz=N parameter in the sqlite_stat1 table needs to have a value of -+# 2 or more to avoid a division by zero in the query planner. -+# -+do_execsql_test 4.4 { -+ DROP TABLE IF EXISTS t44; -+ CREATE TABLE t44(a PRIMARY KEY); -+ INSERT INTO sqlite_stat1 VALUES('t44',null,'sz=0'); -+ ANALYZE sqlite_master; -+ SELECT 0 FROM t44 WHERE a IN(1,2,3); -+} {} -+ -+ - - # The sz=NNN parameter works even if there is other extraneous text - # in the sqlite_stat1.stat column. diff --git a/sqlite3-avoid-truncation-error.patch b/sqlite3-avoid-truncation-error.patch new file mode 100644 index 0000000..5c0062f --- /dev/null +++ b/sqlite3-avoid-truncation-error.patch @@ -0,0 +1,18 @@ +Index: src/date.c +================================================================== +--- src/date.c ++++ src/date.c +@@ -686,11 +686,11 @@ + */ + if( sqlite3_stricmp(z, "unixepoch")==0 && p->rawS ){ + r = p->s*1000.0 + 210866760000000.0; + if( r>=0.0 && r<464269060800000.0 ){ + clearYMD_HMS_TZ(p); +- p->iJD = (sqlite3_int64)r; ++ p->iJD = (sqlite3_int64)(r + 0.5); + p->validJD = 1; + p->rawS = 0; + rc = 0; + } + } + diff --git a/sqlite3.changes b/sqlite3.changes index 60508fa..365284c 100644 --- a/sqlite3.changes +++ b/sqlite3.changes @@ -1,3 +1,52 @@ +------------------------------------------------------------------- +Fri Jan 17 14:29:39 UTC 2020 - Stefan BrĂ¼ns + +- Fix regression found when running python-Django/Djano1 testsuite: + + 7833feecfe-Prevent-SQLite-from-bad-NULL-assumption.patch + + 548082dfab-Improvements-to-the-LEFT-JOIN.patch + + 8a39167bd2-Further-improvements-to-LEFT-JOIN.patch +- Fix check for existing dirs, triggers when running the testsuite + on BTRFS or XFS: + + fix_dir_exists_on_btrfs.patch +- Fix truncation/bad rounding of timestamps in SQLite strftime + function, exposed when running testsuite on i586: + + sqlite3-avoid-truncation-error.patch + +------------------------------------------------------------------- +Fri Oct 11 15:05:00 UTC 2019 - Andreas Stieger + +- sqlite 3.30.1: + * fix a segfault for nested queries that use the FILTER clause + ib aggregate functions (introduced in 3.30.0) + +------------------------------------------------------------------- +Sun Oct 6 15:43:57 UTC 2019 - Andreas Stieger + +- update to 3.30.0: + * Add support for the FILTER clause on aggregate functions + * Add support for the NULLS FIRST and NULLS LAST syntax in ORDER BY clauses + * The index_info and index_xinfo pragmas are enhanced to provide + information about the on-disk representation of WITHOUT ROWID tables + * Add the sqlite3_drop_modules() interface, allowing applications + to disable automatically loaded virtual tables that they do not need + * Improvements to the .recover dot-command in the CLI so that it + recovers more content from corrupt database files + * Enhance the RBU extension to support indexes on expressions + * Change the schema parser so that it will error out if any of + the type, name, and tbl_name columns of the sqlite_master table + have been corrupted and the database connection is not in + writable_schema mode. + * The PRAGMA function_list, PRAGMA module_list, and PRAGMA + pragma_list commands are now enabled in all builds by default + * Add the SQLITE_DBCONFIG_ENABLE_VIEW option for sqlite3_db_config(). + * Added the TCL Interface config method in order to be able to + disable SQLITE_DBCONFIG_ENABLE_VIEW as well as control other + sqlite3_db_config() options from TCL. + * Added the SQLITE_DIRECTONLY flag for application-defined SQL + functions to prevent those functions from being used inside + triggers and views +- drop sqlite3-CVE-2019-16168.patch, upstream + ------------------------------------------------------------------- Tue Sep 10 15:17:35 UTC 2019 - Reinhard Max diff --git a/sqlite3.spec b/sqlite3.spec index d062eb3..cd9f69d 100644 --- a/sqlite3.spec +++ b/sqlite3.spec @@ -1,7 +1,7 @@ # # spec file for package sqlite3 # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,10 +16,11 @@ # +%bcond_with icu %define oname sqlite -%define tarversion 3290000 +%define tarversion 3300100 Name: sqlite3 -Version: 3.29.0 +Version: 3.30.1 Release: 0 Summary: Embeddable SQL Database Engine License: SUSE-Public-Domain @@ -28,8 +29,20 @@ URL: http://www.sqlite.org/ Source0: http://www.sqlite.org/2019/sqlite-src-%{tarversion}.zip Source1: baselibs.conf Source2: http://www.sqlite.org/2019/sqlite-doc-%{tarversion}.zip -Patch0: sqlite3-CVE-2019-16168.patch +# PATCH-FIX-UPSTREAM -- Fix errors with NULL +Patch0: 7833feecfe-Prevent-SQLite-from-bad-NULL-assumption.patch +# PATCH-FIX-UPSTREAM -- Fix errors in LEFT JOIN +Patch1: 548082dfab-Improvements-to-the-LEFT-JOIN.patch +# PATCH-FIX-UPSTREAM -- Fix errors in LEFT JOIN +Patch2: 8a39167bd2-Further-improvements-to-LEFT-JOIN.patch +# PATCH-FIX-UPSTREAM -- Fix incorrect check of stat.size for directories +Patch3: fix_dir_exists_on_btrfs.patch +# PATCH-FIX-OPENSUSE -- Fix error introduced by rounding and truncation, mostly visible on x86 / 80 bit floats +Patch4: sqlite3-avoid-truncation-error.patch BuildRequires: automake +%if %{with icu} +BuildRequires: libicu-devel +%endif BuildRequires: libtool BuildRequires: pkgconfig BuildRequires: readline-devel @@ -104,13 +117,19 @@ other documentation found on sqlite.org. The files can be found in %prep %setup -q -n sqlite-src-%{tarversion} -a2 -%patch0 +%patch0 -p0 +%patch1 -p0 +%patch2 -p0 +%patch3 -p0 +%patch4 -p0 + rm -v sqlite-doc-%{tarversion}/releaselog/current.html ln -sv `echo %{version} | sed "s/\./_/g"`.html sqlite-doc-%{tarversion}/releaselog/current.html find -type f -name sqlite.css~ -delete +cmp sqlite-doc-%{tarversion}/fileformat{,2}.html && ln -sf fileformat.html sqlite-doc-%{tarversion}/fileformat2.html %build -export LIBS="$LIBS -lm " +export LIBS="$LIBS -lm %{?with_icu:-licuuc -licui18n}" export CFLAGS="%{optflags} \ -DSQLITE_ENABLE_API_ARMOR \ -DSQLITE_ENABLE_COLUMN_METADATA \ @@ -119,6 +138,9 @@ export CFLAGS="%{optflags} \ -DSQLITE_ENABLE_FTS3 \ -DSQLITE_ENABLE_FTS4 \ -DSQLITE_ENABLE_FTS5 \ +%if %{with icu} + -DSQLITE_ENABLE_ICU \ +%endif -DSQLITE_ENABLE_JSON1 \ -DSQLITE_ENABLE_RBU \ -DSQLITE_ENABLE_RTREE \ @@ -140,12 +162,8 @@ export CFLAGS="%{optflags} \ make %{?_smp_mflags} sqlite3.c make %{?_smp_mflags} -%ifnarch %{ix86} -# Tests fail due to slight precision variation caused by FPU being 80-bit internally. -# see https://bugs.gentoo.org/628242 %check make %{?_smp_mflags} test -%endif %install %make_install