]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The generate_series rewrite is working better now, but is still not
authordrh <>
Sun, 28 Sep 2025 10:36:23 +0000 (10:36 +0000)
committerdrh <>
Sun, 28 Sep 2025 10:36:23 +0000 (10:36 +0000)
completely correct.

FossilOrigin-Name: 6c41d14707e6890ca6d0460c72178ccb710d7f41dead76f222f1382c5cbd5a9a

ext/misc/series.c
manifest
manifest.uuid

index dc4b100410149b19ae25fd7652691038899e3172..fccd5ff524d46bf5798903c29cb4249bdb0df8e5 100644 (file)
@@ -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->iBase<iMin ){
-          if( pCur->iBase > 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->iBase<iMax ){
-          if( pCur->iBase < 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->iTerm<iMin ){
         pCur->iTerm = iMin;
       }
-      if( pCur->iBase<pCur->iTerm ){
-        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->iBase<pCur->iTerm ){
+      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:
index 111dffc0ad14bfacdcdf1519784121da0f7a9d93..557c194bfa5cc341b4e2a935edaa3fe38ce69709 100644 (file)
--- 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.
index 918e1a976c0e663b39ea6052085fa212825b62f2..21e715d76a3ac42d809af9cb237e6c9e34f59070 100644 (file)
@@ -1 +1 @@
-25e395a82f14513bf23c1e913fe24be77ad74fec1540f524e709f9cdfeb3dc56
+6c41d14707e6890ca6d0460c72178ccb710d7f41dead76f222f1382c5cbd5a9a