]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add support for width to %J and %j.
authordrh <>
Thu, 7 May 2026 10:46:39 +0000 (10:46 +0000)
committerdrh <>
Thu, 7 May 2026 10:46:39 +0000 (10:46 +0000)
FossilOrigin-Name: 0b102f2076586c08b134c78cc18acdd05555fa2b534c895535e96a0466661910

manifest
manifest.uuid
src/printf.c
test/printf.test

index 0417ed7e391c0c5cfc97a1f44441f067bc976f66..be3fd47d29b7eb51db35ea8f0a7c409153eeaeec 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Separate\sconversion\sletters\s%J\sand\s%j.\s\s%J\sincludes\ssurrounding\squotes\sand\n%j\somits\sthem.\s\sSome\stest\scases\sadded.
-D 2026-05-07T08:58:10.524
+C Add\ssupport\sfor\swidth\sto\s%J\sand\s%j.
+D 2026-05-07T10:46:39.530
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -731,7 +731,7 @@ F src/pcache.h 092b758d2c5e4dabb30eae46d8dfad77c0f70b16bf3ff1943f7a232b0fe0d4ba
 F src/pcache1.c 131ca0daf4e66b4608d2945ae76d6ed90de3f60539afbd5ef9ec65667a5f2fcd
 F src/pragma.c 789ef67117b74b5be0a2db6681f7f0c55e6913791b9da309aefd280de2c8a74d
 F src/prepare.c f6a6e28a281bd1d1da12f47d370a81af46159b40f73bf7fa0b276b664f9c8b7d
-F src/printf.c 1e6fc3f472d530f3a470ed608fdb65e491bcd47aa89f6398e396248d2b8c6eb8
+F src/printf.c 99eeffc41ce1feeaa646523224be0723a4123a6fa2a781fdce2b6aeaee83431e
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c fcc406bfb055bee9954ee77c023f4a2a66a24bcdf1573516a72280811a269c20
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
@@ -1519,7 +1519,7 @@ F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d
 F test/pragma6.test c5ec577ba087954b4dfa619a3cbe97b155b60a0af487527abe89b10fc17e6512
 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8
 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9
-F test/printf.test 764be5acb9a05c1e95223be39f63700e08fef6fd2a00b0132367c24575399513
+F test/printf.test eac015b2345ec40a07efb197e157dfb980fdb40ec80c76cf8214eee84d76b276
 F test/printf2.test 3f55c1871a5a65507416076f6eb97e738d5210aeda7595a74ee895f2224cce60
 F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb
 F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
@@ -2203,8 +2203,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 18166bce208c64b7f3afaa88c27a10e0295a89f9c72942dcaa949cf7efb479e6
-R d336b3fe92a34a0f426cd88f8c5f00bf
+P ea7c2c1a6bd32695fc3a1f2295b4c4719e3d9dd0a8f6480e7c95e17b564c3391
+R fc6faed7393cf062c8ad4d1a9c86e71c
 U drh
-Z 137464fef3bd5dbf80b7ef72f16e7f25
+Z 10ba1a2ad4777c5cd6c331ae13689980
 # Remove this line to create a well-formed Fossil manifest.
index e6d9304cae1b901574e74821625fc293f1c7623c..b89f0d993b566e47d19c0bfb0ef87ad432f4564a 100644 (file)
@@ -1 +1 @@
-ea7c2c1a6bd32695fc3a1f2295b4c4719e3d9dd0a8f6480e7c95e17b564c3391
+0b102f2076586c08b134c78cc18acdd05555fa2b534c895535e96a0466661910
index 32105d6ecf589bebc7c5a01d3f0529264a5e8e29..1bde7e87a8608665e533ec4783be0fe2a9bdd719 100644 (file)
@@ -875,7 +875,7 @@ void sqlite3_str_vappendf(
       case etESCAPE_j:           /* %j: JSON string literal w/o "..." */
       case etESCAPE_J: {         /* %J: Generate a JSON string literal */
         char *escarg;
-        i64 i, j, px;
+        i64 i, j, px, iStart;
         unsigned char ch;
 
         if( bArgList ){
@@ -883,6 +883,7 @@ void sqlite3_str_vappendf(
         }else{
           escarg = va_arg(ap,char*);
         }
+        iStart = sqlite3_str_length(pAccum);
         if( escarg==0 ){
           if( xtype==etESCAPE_J ) sqlite3_str_append(pAccum, "null", 4);
         }else{
@@ -918,9 +919,26 @@ void sqlite3_str_vappendf(
           if( j<i-1 ) sqlite3_str_append(pAccum, &escarg[j], i-j);
           if( xtype==etESCAPE_J ) sqlite3_str_append(pAccum, "\"", 1);
         }
-        length = 0;
-        width = 0;
-        break;
+        if( width>0 ){
+          sqlite3_int64 n = sqlite3_str_length(pAccum) - iStart;
+          sqlite3_int64 len = n;
+          if( flag_altform2 ){
+            const char *zz = sqlite3_str_value(pAccum) + iStart;
+            for(i=0; zz[i]; i++){
+              if( (zz[i]&0xc0)==0x80 ) len--;
+            }
+          }
+          if( width>len ){
+            sqlite3_int64 sp = width-len;
+            sqlite3_str_appendchar(pAccum, sp, ' ');
+            if( !flag_leftjustify ){
+              char *zz = sqlite3_str_value(pAccum) + iStart;
+              memmove(zz+sp, zz, n);
+              memset(zz, ' ', sp);
+            }
+          }
+        }
+        continue;
       }
       case etESCAPE_q:          /* %q: Escape ' characters */
       case etESCAPE_Q:          /* %Q: Escape ' and enclose in '...' */
index e17eb5543429414da87149e116bb41bc40f9cbe8..22d376101d9fed2f7e5ca7dc7b7d7a3398b7b373 100644 (file)
@@ -3892,5 +3892,41 @@ do_execsql_test printf-20.10 {
   SELECT format('1-%j-2-%J-3',null,null);
 } {1--2-null-3}
 
+do_execsql_test printf-20.11 {
+  SELECT format('<%6J>','いち');
+} {<\"いち\">}
+do_execsql_test printf-20.12 {
+  SELECT format('<%!6J>','いち');
+} {{<  "いち">}}
+do_execsql_test printf-20.13 {
+  SELECT format('<%!-6J>','いち');
+} {{<"いち"  >}}
+do_execsql_test printf-20.14 {
+  SELECT format('<%6.8J>','いち, に, さん');
+} {{<"いち, ">}}
+do_execsql_test printf-20.15 {
+  SELECT format('<%!6.2J>','いち, に, さん');
+} {{<  "いち">}}
+do_execsql_test printf-20.16 {
+  SELECT format('<%!-6.2J>','いち, に, さん');
+} {{<"いち"  >}}
+do_execsql_test printf-20.17 {
+  SELECT format('<%6j>','いち');
+} {{<いち>}}
+do_execsql_test printf-20.18 {
+  SELECT format('<%!6j>','いち');
+} {{<    いち>}}
+do_execsql_test printf-20.19 {
+  SELECT format('<%!-6j>','いち');
+} {{<いち    >}}
+do_execsql_test printf-20.20 {
+  SELECT format('<%6.8j>','いち, に, さん');
+} {{<いち,   >}}
+do_execsql_test printf-20.21 {
+  SELECT format('<%!6.2j>','いち, に, さん');
+} {{<    いち>}}
+do_execsql_test printf-20.22 {
+  SELECT format('<%!-6.2j>','いち, に, さん');
+} {{<いち    >}}
 
 finish_test