From: drh <> Date: Sun, 28 Sep 2025 10:36:23 +0000 (+0000) Subject: The generate_series rewrite is working better now, but is still not X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9ffb344ed962bb76020bf0e865e6ce82fc94ab30;p=thirdparty%2Fsqlite.git The generate_series rewrite is working better now, but is still not completely correct. FossilOrigin-Name: 6c41d14707e6890ca6d0460c72178ccb710d7f41dead76f222f1382c5cbd5a9a --- diff --git a/ext/misc/series.c b/ext/misc/series.c index dc4b100410..fccd5ff524 100644 --- a/ext/misc/series.c +++ b/ext/misc/series.c @@ -542,7 +542,7 @@ static int seriesFilter( sqlite3_uint64 span = span64(iMin,pCur->iBase); pCur->iBase = add64(pCur->iBase, (span/pCur->iStep)*pCur->iStep); if( pCur->iBaseiBase > LARGEST_INT64 - pCur->iStep ){ + if( pCur->iBase > sub64(LARGEST_INT64, pCur->iStep) ){ goto series_no_rows; } pCur->iBase = add64(pCur->iBase, pCur->iStep); @@ -551,17 +551,12 @@ static int seriesFilter( if( pCur->iTerm>iMax ){ pCur->iTerm = iMax; } - if( pCur->iBase>pCur->iTerm ){ - goto series_no_rows; - } - pCur->iTerm = sub64(pCur->iTerm, - span64(pCur->iTerm,pCur->iBase) % pCur->iStep); }else{ if( pCur->iBase>iMax ){ sqlite3_uint64 span = span64(pCur->iBase,iMax); pCur->iBase = sub64(pCur->iBase, (span/pCur->iStep)*pCur->iStep); if( pCur->iBaseiBase < SMALLEST_INT64 + pCur->iStep ){ + if( pCur->iBase < add64(SMALLEST_INT64, pCur->iStep) ){ goto series_no_rows; } pCur->iBase = sub64(pCur->iBase, pCur->iStep); @@ -570,14 +565,25 @@ static int seriesFilter( if( pCur->iTermiTerm = iMin; } - if( pCur->iBaseiTerm ){ - goto series_no_rows; - } - pCur->iTerm = add64(pCur->iTerm, - span64(pCur->iBase,pCur->iTerm) % pCur->iStep); } } + /* Adjust iTerm so that it is exactly the last value of the series. + */ + if( pCur->bDesc==0 ){ + if( pCur->iBase>pCur->iTerm ){ + goto series_no_rows; + } + pCur->iTerm = sub64(pCur->iTerm, + span64(pCur->iTerm,pCur->iBase) % pCur->iStep); + }else{ + if( pCur->iBaseiTerm ){ + goto series_no_rows; + } + pCur->iTerm = add64(pCur->iTerm, + span64(pCur->iBase,pCur->iTerm) % pCur->iStep); + } + /* Transform the series generator to output values in the requested ** order. */ @@ -597,15 +603,17 @@ static int seriesFilter( if( iOffset>0 ){ if( seriesSteps(pCur) < (sqlite3_uint64)iOffset ){ goto series_no_rows; + }else if( pCur->bDesc ){ + pCur->iBase = sub64(pCur->iBase, pCur->iStep*iOffset); }else{ - pCur->iBase += pCur->iStep*iOffset; + pCur->iBase = add64(pCur->iBase, pCur->iStep*iOffset); } } if( iLimit>=0 && (nStep = seriesSteps(pCur)) > (sqlite3_uint64)iLimit ){ - pCur->iTerm = pCur->iBase + (iLimit - 1)*pCur->iStep; + pCur->iTerm = add64(pCur->iBase, (iLimit - 1)*pCur->iStep); } } - + pCur->iValue = pCur->iBase; return SQLITE_OK; series_no_rows: diff --git a/manifest b/manifest index 111dffc0ad..557c194bfa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\sthe\sgenerate_series\sextension.\s\sCompiles\sbut\sdoes\snot\syet\swork. -D 2025-09-28T09:25:07.699 +C The\sgenerate_series\srewrite\sis\sworking\sbetter\snow,\sbut\sis\sstill\snot\ncompletely\scorrect. +D 2025-09-28T10:36:23.742 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -393,7 +393,7 @@ F ext/misc/regexp.c 548151f3e57506fda678e6a65e85a763f4eece653287e1ad44e167f9485e F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 -F ext/misc/series.c b407972ed56875dde2391f9bc6f9b97a747c6773e0c24b3c0bef90c7abf6d241 +F ext/misc/series.c e9b38d6f5211fb26cb27b57c8dea11f52761581a51b756bd1a79bfb47b069224 F ext/misc/sha1.c cb5002148c2661b5946f34561701e9105e9d339b713ec8ac057fd888b196dcb9 F ext/misc/shathree.c fd22d70620f86a0467acfdd3acd8435d5cb54eb1e2d9ff36ae44e389826993df F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 @@ -2169,11 +2169,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1f6deabfff2fc2fed5fbff48d2637b48245e5a946a442c4bcc9b9ecb7c4848b9 -R 4e452204986d0c45df27a97046f3f517 -T *branch * series-refactor -T *sym-series-refactor * -T -sym-trunk * +P 25e395a82f14513bf23c1e913fe24be77ad74fec1540f524e709f9cdfeb3dc56 +R 3e4f52140b7d0e3340a0452564ef8f35 U drh -Z 071d8b62d426a1558a72e68c9afcf0d6 +Z 95aa644c466b7b35cab0cc48602bf168 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 918e1a976c..21e715d76a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25e395a82f14513bf23c1e913fe24be77ad74fec1540f524e709f9cdfeb3dc56 +6c41d14707e6890ca6d0460c72178ccb710d7f41dead76f222f1382c5cbd5a9a