]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve performance of the shell tool ".ar" command when it is given a large number... ar-performance-improvement
authordan <Dan Kennedy>
Wed, 15 Oct 2025 15:54:38 +0000 (15:54 +0000)
committerdan <Dan Kennedy>
Wed, 15 Oct 2025 15:54:38 +0000 (15:54 +0000)
FossilOrigin-Name: 0398897067ca5cdedfef0ce7a034ba6d5a2ce6104605ef4ed1c7549499435b44

manifest
manifest.tags
manifest.uuid
src/shell.c.in

index c74317dcc25022e30efddbe6dffc846a9908bf5c..cea8a419a050165766d65d019c977601e68d2ed7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\smemory\sallocation\sin\sthe\s".table"\scommand\sof\sthe\s.cli\swhen\sthe\snumber\nof\stables\sin\sthe\sdatabase\sfile\sapproaches\s2\sbillion.
-D 2025-10-15T10:52:45.276
+C Improve\sperformance\sof\sthe\sshell\stool\s".ar"\scommand\swhen\sit\sis\sgiven\sa\slarge\snumber\sof\sarguments.
+D 2025-10-15T15:54:38.242
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -736,7 +736,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c f8d1d011aba0964ff1bdccd049d4d2c2fec217efd90d202a4bb775e926b2c25d
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c b95181711d59c36d9789e67f76c4cfec64b99f9629a50be5e6566e117b87d957
-F src/shell.c.in f5243232283bdafe9804cdfb02d3d6dbfd992a69e88e911726053a4c6959d41f
+F src/shell.c.in cd2cc9a78e36311f0aed2aaa4241ca6078030841a9cc931032e8f50eb495703c
 F src/sqlite.h.in 10faecc456d3962c7cedae70d69305f7c80129f28dd8524bd8a06b3eac955e54
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
 F src/sqlite3ext.h 7f236ca1b175ffe03316d974ef57df79b3938466c28d2f95caef5e08c57f3a52
@@ -2171,8 +2171,11 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 1738f0bdf5941a70684c82d2040561e53a272595026a837a9f9bab8508a46480
-R 1dbf964e481b54df9bb3b131a4237ef8
-U drh
-Z fd056c381ae9f263080e8efcbef5c8b3
+P 5cbccab499bc3983aac1f57355552db607dee6c7ef4eb00d794dbee89c18db70
+R 4fa60e65ba608ab32ad88339468e7a7d
+T *branch * ar-performance-improvement
+T *sym-ar-performance-improvement *
+T -sym-trunk *
+U dan
+Z beccb22416da2df34cf401db7c5c23db
 # Remove this line to create a well-formed Fossil manifest.
index bec971799ff1b8ee641c166c7aeb22d12c785393..ef589d4901a7081330a6a9f150c6c19191ba4cbd 100644 (file)
@@ -1,2 +1,2 @@
-branch trunk
-tag trunk
+branch ar-performance-improvement
+tag ar-performance-improvement
index 26a904132829f48856576864d97140e7db2a54d8..6fd039ac3879313315aebce43db6b86b0b900417 100644 (file)
@@ -1 +1 @@
-5cbccab499bc3983aac1f57355552db607dee6c7ef4eb00d794dbee89c18db70
+0398897067ca5cdedfef0ce7a034ba6d5a2ce6104605ef4ed1c7549499435b44
index 51dc4cbf54d53e50ec0864ab12ca0d4c24feebc0..d9afce98c93617bac744be071127a0fca8dcc1af 100644 (file)
@@ -7873,25 +7873,41 @@ static void arWhereClause(
   char **pzWhere                  /* OUT: New WHERE clause */
 ){
   char *zWhere = 0;
-  const char *zSameOp = (pAr->bGlob)? "GLOB" : "=";
   if( *pRc==SQLITE_OK ){
     if( pAr->nArg==0 ){
       zWhere = sqlite3_mprintf("1");
     }else{
+      char *z1 = sqlite3_mprintf(pAr->bGlob ? "" : "name IN(");
+      char *z2 = sqlite3_mprintf("");
+      const char *zSep1 = "";
+      const char *zSep2 = "";
+
       int i;
-      const char *zSep = "";
-      for(i=0; i<pAr->nArg; i++){
+      for(i=0; i<pAr->nArg && z1 && z2; i++){
         const char *z = pAr->azArg[i];
-        zWhere = sqlite3_mprintf(
-          "%z%s name %s '%q' OR substr(name,1,%d) %s '%q/'",
-          zWhere, zSep, zSameOp, z, strlen30(z)+1, zSameOp, z
-        );
-        if( zWhere==0 ){
-          *pRc = SQLITE_NOMEM;
-          break;
+        int n = strlen30(z);
+
+        if( pAr->bGlob ){
+          z1 = sqlite3_mprintf("%z%sname GLOB '%q'", z1, zSep2, z);
+          z2 = sqlite3_mprintf(
+              "%z%ssubstr(name,1,%d) GLOB '%q/'", z2, zSep2, n+1,z
+          );
+        }else{
+          z1 = sqlite3_mprintf("%z%s'%q'", z1, zSep1, z);
+          z2 = sqlite3_mprintf("%z%ssubstr(name,1,%d) = '%q/'",z2,zSep2,n+1,z);
         }
-        zSep = " OR ";
+        zSep1 = ", ";
+        zSep2 = " OR ";
+      }
+      if( z1==0 || z2==0 ){
+        *pRc = SQLITE_NOMEM;
+      }else{
+        zWhere = sqlite3_mprintf("(%s%s OR (name GLOB '*/*' AND (%s))) ",
+            z1, pAr->bGlob==0 ? ")" : "", z2
+        );
       }
+      sqlite3_free(z1);
+      sqlite3_free(z2);
     }
   }
   *pzWhere = zWhere;