]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with group_concat() when it is used as a window function with
authordrh <>
Fri, 1 Oct 2021 22:48:52 +0000 (22:48 +0000)
committerdrh <>
Fri, 1 Oct 2021 22:48:52 +0000 (22:48 +0000)
a sliding window, as described by
[forum:/forumpost/f3eb24a6c0|forum thread f3eb24a6c0].

FossilOrigin-Name: f47f7f78227830c065d9ce715b8456eab81a38d680f76bf4ff08f298d84f9c7a

1  2 
manifest
manifest.uuid
src/func.c
src/sqliteInt.h

diff --cc manifest
index b40ba434390521ad667bc8c9e1116857b147d2f0,38694f3a3dd9fd475f074face905ca4773dc1005..7286e6e0f85f9477c0a184da7d54992659c70a39
+++ b/manifest
@@@ -1,5 -1,5 +1,5 @@@
- C Fix\sharmless\scompiler\swarnings.
- D 2021-10-01T21:01:07.786
 -C Remove\sunreachable\sbranches\sin\sthe\sfixed\sgroup_concat()\scode.
 -D 2021-10-01T02:45:48.526
++C Fix\sa\sproblem\swith\sgroup_concat()\swhen\sit\sis\sused\sas\sa\swindow\sfunction\swith\na\ssliding\swindow,\sas\sdescribed\sby\n[forum:/forumpost/f3eb24a6c0|forum\sthread\sf3eb24a6c0].
++D 2021-10-01T22:48:52.993
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@@ -504,7 -504,7 +504,7 @@@ F src/delete.c 3ce6af6b64c8b476de51ccc3
  F src/expr.c 82797e5d82422d34ede9a95ba459f40c317b2daadb21109a21abfd42f84e3ed8
  F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
  F src/fkey.c 1905af1821b88321e1bb9d6a69e704495b6844a9b6c29398d40117cc251e893c
- F src/func.c 812ac5383067bed7150d8597e83c47b714d73db0e62af55811d1a145243e58e1
 -F src/func.c 3b8bfd557ae3dc64a2e5c84ae300c770d66f17c13c9066badddcff9a5a74d10d
++F src/func.c f4924c04e95335762ed1b24f184df26d0db5b20e87decbc5a0ed6431f7ebd9ca
  F src/global.c 612ea60c9acbcb45754c2ed659b4a56936a06814718e969636fedc7e3b889808
  F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19
  F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38
@@@ -554,7 -554,7 +554,7 @@@ F src/shell.c.in 928114971b558dc2e40a1a
  F src/sqlite.h.in 4e977a5e2ed1a9e8987ff65a2cab5f99a4298ebf040ea5ff636e1753339ff45a
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510
- F src/sqliteInt.h c481cd4864217bdff96fc2a7054cdaca0edabe0eb9f6cce8b012d1e014ccdc5f
 -F src/sqliteInt.h 90aabdfc427a6356f0ff1ed77c886f823d10e08f100e992816dec1033c225079
++F src/sqliteInt.h 2cfc99065003dd1f5d91a85114449f920fde0adbea4bdbd524fca8907a6e38f3
  F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
  F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1
  F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@@ -1799,13 -1799,14 +1799,14 @@@ F test/window8.tcl 5e02e41d9d9a80f59706
  F test/window8.test 4ab16817414af0c904abe2ebdf88eb6c2b00058b84f9748c6174ff11fc45f1ed
  F test/window9.test 349c71eab4288a1ffc19e2f65872ec2c37e6cf8a1dda2ad300364b7450ae4836
  F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be
- F test/windowB.test 6e601f8178ba8ba28b2f19e74fe613815084bb4a8d2ad942defc7d42e191e521
+ F test/windowB.test b67bda5645f3226790e1a360c4225241840b84adb5aa2e69bfb0b27eef3b84d9
+ F test/windowC.test ecf1831b995408b03f708386b37ece7a05108faf2288c0c55cff873c100e145f
  F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0
  F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b
- F test/windowfault.test 21919e601f20b976ea2a73aa401220c89ed0e8d203c4f69476ea55bce3726496
+ F test/windowfault.test 15094c1529424e62f798bc679e3fe9dfab6e8ba2f7dfe8c923b6248c31660a7c
  F test/windowpushd.test d8895d08870b7226f7693665bd292eb177e62ca06799184957b3ca7dc03067df
  F test/with1.test 7bc5abfe4c80c0cef8a90f5a66d60b9982e8ccd7350c8eb70611323a3b8e07ba
 -F test/with2.test f803743b2c746ecdd0b638783c7235654b947b0f1c4bb551ca10e1d813317153
 +F test/with2.test a1df41b987198383b9b70bf5e5fda390582e46398653858dbc6ceb24253b28df
  F test/with3.test ad32d13ad50661e6fa305f62a0717649c348792e7b658bf2644976227a9e0373
  F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
  F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8
@@@ -1928,7 -1929,7 +1929,8 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 2f7c946c5f25a858167f5193ca06e53310394c8cff15426ab8a1327a1ec835fd
- R efed3f9c2718d18bc8a69a58b9e2f371
 -P 35351371c5e9602dec210ad0926ff8a1a269556ce1a166e81eb0543938e0c57e
 -R a4645f8bac89b041843b69411193844d
++P 94b59691ee50a4666b25e36d1529fc52f714bbe94c3e8ccb35bf0a4ea11050db 8bd721c29e7a28cd75885dd80235e4e37aa0847229f769f49e01127f794fa63a
++R 755a222a3849cf0b99ca8b66d427fd7c
++T +closed 8bd721c29e7a28cd75885dd80235e4e37aa0847229f769f49e01127f794fa63a
  U drh
- Z 00ef577a561ca93dc97c1f48c37c36a1
 -Z 93aa411e4c74267eee528d19e6131eb7
++Z d91f8598d681fe6b47f22c72a76f272f
diff --cc manifest.uuid
index fb3f190d8a28997259c206d67d50bb46b53e7023,5ba132f6ce46769c463604fdafc62053289494c9..83de866a84b6b2d1263f2cd3baa643da5109d472
@@@ -1,1 -1,1 +1,1 @@@
- 94b59691ee50a4666b25e36d1529fc52f714bbe94c3e8ccb35bf0a4ea11050db
 -8bd721c29e7a28cd75885dd80235e4e37aa0847229f769f49e01127f794fa63a
++f47f7f78227830c065d9ce715b8456eab81a38d680f76bf4ff08f298d84f9c7a
diff --cc src/func.c
index b47378a3be58b45a9ddab23bd5874ec0247cb4c9,fddced62db2d331ff25afb57009af5297de83de6..900ea94c679a76c05e3069d50bcbc5841a5a5a2d
@@@ -1754,27 -1812,37 +1812,38 @@@ static void groupConcatInverse
    int argc,
    sqlite3_value **argv
  ){
-   int n;
-   StrAccum *pAccum;
+   GroupConcatCtx *pGCC;
    assert( argc==1 || argc==2 );
++  (void)argc;  /* Suppress unused parameter warning */
    if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return;
-   pAccum = (StrAccum*)sqlite3_aggregate_context(context, sizeof(*pAccum));
-   /* pAccum is always non-NULL since groupConcatStep() will have always
+   pGCC = (GroupConcatCtx*)sqlite3_aggregate_context(context, sizeof(*pGCC));
+   /* pGCC is always non-NULL since groupConcatStep() will have always
    ** run frist to initialize it */
-   if( ALWAYS(pAccum) ){
-     n = sqlite3_value_bytes(argv[0]);
-     if( argc==2 ){
-       n += sqlite3_value_bytes(argv[1]);
+   if( ALWAYS(pGCC) ){
+     int nVS = sqlite3_value_bytes(argv[0]);
+     pGCC->nAccum -= 1;
+     if( pGCC->pnSepLengths!=0 ){
+       assert(pGCC->nAccum >= 0);
+       if( pGCC->nAccum>0 ){
+         nVS += *pGCC->pnSepLengths;
+         memmove(pGCC->pnSepLengths, pGCC->pnSepLengths+1,
+                (pGCC->nAccum-1)*sizeof(int));
+       }
      }else{
-       n++;
+       /* If removing single accumulated string, harmlessly over-do. */
+       nVS += pGCC->nFirstSepLength;
      }
-     if( n>=(int)pAccum->nChar ){
-       pAccum->nChar = 0;
+     if( nVS>=(int)pGCC->str.nChar ){
+       pGCC->str.nChar = 0;
      }else{
-       pAccum->nChar -= n;
-       memmove(pAccum->zText, &pAccum->zText[n], pAccum->nChar);
+       pGCC->str.nChar -= nVS;
+       memmove(pGCC->str.zText, &pGCC->str.zText[nVS], pGCC->str.nChar);
+     }
+     if( pGCC->str.nChar==0 ){
+       pGCC->str.mxAlloc = 0;
+       sqlite3_free(pGCC->pnSepLengths);
+       pGCC->pnSepLengths = 0;
      }
-     if( pAccum->nChar==0 ) pAccum->mxAlloc = 0;
    }
  }
  #else
diff --cc src/sqliteInt.h
Simple merge