]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
New test cases for QRF
authordrh <>
Tue, 2 Dec 2025 18:37:49 +0000 (18:37 +0000)
committerdrh <>
Tue, 2 Dec 2025 18:37:49 +0000 (18:37 +0000)
FossilOrigin-Name: e49c63e31888c6787ab13f736d58ff985a24c3f98b475e05c30e8b244afffb80

ext/qrf/qrf.c
ext/qrf/qrf.h
manifest
manifest.uuid
src/tclsqlite.c
test/qrf05.test [new file with mode: 0644]
test/qrf06.test [new file with mode: 0644]

index 1e3a3a44ba0eaaa36a6a1d6ffe02ae62e155e897..82df33876c8709b97ebada573fccf39359b6299e 100644 (file)
@@ -537,13 +537,20 @@ static int qrfIsVt100(const unsigned char *z){
 
 /*
 ** Return the length of a string in display characters.
-** Multibyte UTF8 characters count as a single character
-** for single-width characters, or as two characters for
-** double-width characters.
+**
+** Most characters of the input string count as 1, including
+** multi-byte UTF8 characters.  However, zero-width unicode
+** characters and VT100 escape sequences count as zero, and
+** double-width characters count as two.
+**
+** The definition of "zero-width" and "double-width" characters
+** is not precise.  It depends on the output device, to some extent,
+** and it varies according to the Unicode version.  This routine
+** makes the best guess that it can.
 */
-static int qrfDisplayLength(const char *zIn){
+size_t sqlite3_qrf_wcswidth(const char *zIn){
   const unsigned char *z = (const unsigned char*)zIn;
-  int n = 0;
+  size_t n = 0;
   while( *z ){
     if( z[0]<' ' ){
       int k;
@@ -2198,7 +2205,7 @@ static void qrfExplain(Qrf *p){
         int len;
         if( i==nArg-1 ) w = 0;
         if( zVal==0 ) zVal = "";
-        len = qrfDisplayLength(zVal);
+        len = (int)sqlite3_qrf_wcswidth(zVal);
         if( len>w ){
           w = len;
           zSep = " ";
@@ -2388,7 +2395,7 @@ static void qrfOneSimpleRow(Qrf *p){
           int sz;
           p->u.sLine.azCol[i] = sqlite3_column_name(p->pStmt, i);
           if( p->u.sLine.azCol[i]==0 ) p->u.sLine.azCol[i] = "unknown";
-          sz = qrfDisplayLength(p->u.sLine.azCol[i]);
+          sz = (int)sqlite3_qrf_wcswidth(p->u.sLine.azCol[i]);
           if( sz > p->u.sLine.mxColWth ) p->u.sLine.mxColWth = sz;
         }
       }
index baaeb4b18d320cb3a25aff566ef67bc4627b631c..5e28d1e9cd203ff68b230a837da10e3586761044 100644 (file)
@@ -176,13 +176,21 @@ int sqlite3_format_query_result(
 ** character c.  For normal characters, the answer is always 1.  But the
 ** estimate might be 0 or 2 for zero-width and double-width characters.
 **
-** Different display devices display unicode using different widths.  So
+** Different devices display unicode using different widths.  So
 ** it is impossible to know that true display width with 100% accuracy.
 ** Inaccuracies in the width estimates might cause columns to be misaligned.
 ** Unfortunately, there is nothing we can do about that.
 */
 int sqlite3_qrf_wcwidth(int c);
 
+/*
+** Return an estimate of the number of display columns used by the
+** string in the argument.  The width of individual characters is
+** determined as for sqlite3_qrf_wcwidth().  VT100 escape code sequences
+** are assigned a width of zero.
+*/
+size_t sqlite3_qrf_wcswidth(const char*);
+
 
 #ifdef __cplusplus
 }
index 233728caf2bd4b7bb87b44eb1d3b59873fc94353..353c5bcf37d1f2573508b2af98ea6398e27bec9c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sharmless\scompiler\swarning\sin\sthe\sprevious\scheck-in.
-D 2025-12-02T15:01:29.826
+C New\stest\scases\sfor\sQRF
+D 2025-12-02T18:37:49.618
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -418,8 +418,8 @@ F ext/misc/zipfile.c 09e6e3a3ff40a99677de3c0bc6569bd5f4709b1844ac3d1c1452a456c5a
 F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee
 F ext/qrf/README.md 86fc5c3c5e3eddbe54fc1235cbdc52b8c2c0732791d224345c3014cd45c4c0e7
 F ext/qrf/dev-notes.md e68a6d91ce4c7eb296ef2daadc2bb79c95c317ad15b9fafe40850c67b29c2430
-F ext/qrf/qrf.c 425d02cffcc5b5fe9ff5817794bf751b1fdd6912f570c354272429ce1262b866
-F ext/qrf/qrf.h 322d48537a5aa39c206c2ec0764a7938ea7662a8c25be1c4e9d742789609ba1e
+F ext/qrf/qrf.c c50368ea2be3ab67bd6698d8b34bf70210d3fbf6b3659ed328543e5ec8d69eff
+F ext/qrf/qrf.h 2cd7bd43579c522d3ae5c16034c7fdf41085684189811ae8e18ebc932a1cc79f
 F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8
 F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255
 F ext/rbu/rbu10.test 7c22caa32c2ff26983ca8320779a31495a6555737684af7aba3daaf762ef3363
@@ -745,7 +745,7 @@ F src/sqliteInt.h a89c3a9296928dffcb4c287df176a739f9cf620c7c9d33aec59e8efb9b39cb
 F src/sqliteLimit.h 0a5516b4ec192a205c541e05f67009028a9451dc6678aae4cf8e68596903c246
 F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
-F src/tclsqlite.c ec2ad3fbf5390c3d4307bc9d1f2a37a9c5d726b5309769dc770ab37f6812152d
+F src/tclsqlite.c 4b6f6b142b951a8a127e0cbd2e37284fc71f8e6a391ec8c6188fb831b51ec0b8
 F src/tclsqlite.h 614b3780a62522bc9f8f2b9fb22689e8009958e7aa77e572d0f3149050af348a
 F src/test1.c 0e71fbcb484a271564e98e0158192c28c24f5521594218c3ba48bcb4cf634f91
 F src/test2.c 62f0830958f9075692c29c6de51b495ae8969e1bef85f239ffcd9ba5fb44a5ff
@@ -1515,6 +1515,8 @@ F test/qrf01.test 48c86e90f606739e67b73937babb662ef0edf1ede06954489c588815fa17b5
 F test/qrf02.test 39b4afdc000bedccdafc0aecf17638df67a67aaa2d2942865ae6abcc48ba0e92
 F test/qrf03.test ad7fa339fb46b26b08625f3a77a4827bdee9f0dad402d8ddc1fcb8f05aa64a54
 F test/qrf04.test 0894692c998d2401dcc33449c02051b503ecce0c94217be54fb007c82d2d1379
+F test/qrf05.test 8ade5bfa7ef0b448e531687203fa8ae9ef41f1d7e4c11d5ba0c4846af75b13d5
+F test/qrf06.test 60ee6a77955a28ff7ab4e418ea71ca7ab8d24d993783a46ec0f7f4223174fabd
 F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca
 F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
 F test/quickcheck.test a4b7e878cd97e46108291c409b0bf8214f29e18fddd68a42bc5c1375ad1fb80a
@@ -2181,8 +2183,8 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P c872bd1ee7b219e055f40e43766e4ed6bc2d2ca8cb92577cd3560f4173b1f257
-R c46cfff780eeed3878512057a17d323b
+P 601c40a1d9e1bcd9c453210c275001543d1533af25b4ccf399d5ef4ea1328950
+R db3be16f518798aa64811be276402ae9
 U drh
-Z 089d78bdb228ed07162c6c905e40e2c9
+Z c58c2647d0ec0d77cab1c57aa88aaed0
 # Remove this line to create a well-formed Fossil manifest.
index e700b2b78577ad6a8753786896c2b44ff17aa9c3..0a563e0d5ba84fb88e9b435dc9479ea1b990f01a 100644 (file)
@@ -1 +1 @@
-601c40a1d9e1bcd9c453210c275001543d1533af25b4ccf399d5ef4ea1328950
+e49c63e31888c6787ab13f736d58ff985a24c3f98b475e05c30e8b244afffb80
index 3cedbf9c30ab0660f8072c8771b70f7b73b4ce31..147a64745b7f5cb0f1e5213ef65a70d5e9d6295b 100644 (file)
@@ -2361,6 +2361,10 @@ static int dbQrf(SqliteDb *pDb, int objc, Tcl_Obj *const*objv){
     }else if( strcmp(zArg,"-null")==0 ){
       qrf.zNull = Tcl_GetString(objv[i+1]);
       i++;
+    }else if( strcmp(zArg,"-version")==0 ){
+      /* Undocumented. Testing use only */
+      qrf.iVersion = atoi(Tcl_GetString(objv[i+1]));
+      i++;
     }else{
       Tcl_AppendResult(pDb->interp, "unknown option: ", zArg, (char*)0);
       rc = TCL_ERROR;
diff --git a/test/qrf05.test b/test/qrf05.test
new file mode 100644 (file)
index 0000000..0d5a4d7
--- /dev/null
@@ -0,0 +1,37 @@
+# 2025-12-02
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# Test cases for the Query Result Formatter (QRF)
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix qrf05
+
+do_execsql_test 1.0 {
+  CREATE TABLE t1(a INT NOT NULL);
+}
+do_test 1.1 {
+  set rc [catch {db format -style list \
+                  {INSERT INTO t1 VALUES(123) RETURNING *}} msg]
+  list $rc [string trim $msg]
+} {0 123}
+do_test 1.2 {
+  set rc [catch {db format -style list \
+                  {INSERT INTO t1 VALUES(NULL) RETURNING *}} msg]
+  list $rc [string trim $msg]
+} {1  {NOT NULL constraint failed: t1.a}}
+do_test 1.3 {
+  set rc [catch {db format -version 99 {SELECT * FROM t1}} msg]
+  list $rc [string trim $msg]
+} {1 {unusable sqlite3_qrf_spec.iVersion (99)}}
+
+finish_test
diff --git a/test/qrf06.test b/test/qrf06.test
new file mode 100644 (file)
index 0000000..21cd7ac
--- /dev/null
@@ -0,0 +1,576 @@
+# 2025-12-02
+#
+# The author disclaims copyright to this source code.  In place of
+# a legal notice, here is a blessing:
+#
+#    May you do good and not evil.
+#    May you find forgiveness for yourself and forgive others.
+#    May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+# Test cases for the Query Result Formatter (QRF), and especially
+# the sqlite3_qrf_wcwidth() function and its utilization.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix qrf06
+
+# Data
+db eval {
+   BEGIN TRANSACTION;
+   CREATE TABLE language(name TEXT);
+   INSERT INTO language(name) VALUES
+     ('العربية'),
+     ('Deutsch'),
+     ('English'),
+     ('Español'),
+     ('فارسی'),
+     ('Français'),
+     ('Italiano'),
+     ('مصرى'),
+     ('Nederlands'),
+     ('日本語'),
+     ('Polski'),
+     ('Português'),
+     ('Sinugboanong Binisaya'),
+     ('Svenska'),
+     ('Українська'),
+     ('Tiếng Việt'),
+     ('Winaray'),
+     ('中文'),
+     ('Русский'),
+     ('Afrikaans'),
+     ('Shqip'),
+     ('Asturianu'),
+     ('Azərbaycanca'),
+     ('Български'),
+     ('閩南語 / Bân-lâm-gú'),
+     ('বাংলা'),
+     ('Беларуская'),
+     ('Català'),
+     ('Čeština'),
+     ('Cymraeg'),
+     ('Dansk'),
+     ('Eesti'),
+     ('Ελληνικά'),
+     ('Esperanto'),
+     ('Euskara'),
+     ('Galego'),
+     ('한국어'),
+     ('Հայերեն'),
+     ('हिन्दी'),
+     ('Hrvatski'),
+     ('Bahasa Indonesia'),
+     ('עברית'),
+     ('ქართული'),
+     ('Ladin'),
+     ('Latina'),
+     ('Latviešu'),
+     ('Lietuvių'),
+     ('Magyar'),
+     ('Македонски'),
+     ('Malagasy'),
+     ('मराठी'),
+     ('Bahasa Melayu'),
+     ('Bahaso Minangkabau'),
+     ('မြန်မာဘာသာ'),
+     ('Norskbokmålnynorsk'),
+     ('Нохчийн'),
+     ('Oʻzbekcha / Ўзбекча'),
+     ('Қазақша / Qazaqşa / قازاقشا'),
+     ('Română'),
+     ('Simple English'),
+     ('Slovenčina'),
+     ('Slovenščina'),
+     ('Српски / Srpski'),
+     ('Srpskohrvatski / Српскохрватски'),
+     ('Suomi'),
+     ('Kiswahili'),
+     ('தமிழ்'),
+     ('Татарча / Tatarça'),
+     ('తెలుగు'),
+     ('ภาษาไทย'),
+     ('Тоҷикӣ'),
+     ('تۆرکجه'),
+     ('Türkçe'),
+     ('اردو'),
+     ('粵語'),
+     ('Bahsa Acèh'),
+     ('Alemannisch'),
+     ('አማርኛ'),
+     ('Aragonés'),
+     ('Արեւմտահայերէն'),
+     ('Bahasa Hulontalo'),
+     ('Basa Bali'),
+     ('Bahasa Banjar'),
+     ('Basa Banyumasan'),
+     ('Башҡортса'),
+     ('Беларуская (тарашкевіца)'),
+     ('Bikol Central'),
+     ('বিষ্ণুপ্রিয়া মণিপুরী'),
+     ('Boarisch'),
+     ('Bosanski'),
+     ('Brezhoneg'),
+     ('Чӑвашла'),
+     ('Dagbanli'),
+     ('الدارجة'),
+     ('Diné Bizaad'),
+     ('Emigliàn–Rumagnòl'),
+     ('Fiji Hindi'),
+     ('Føroyskt'),
+     ('Frysk'),
+     ('Fulfulde'),
+     ('Gaeilge'),
+     ('Gàidhlig'),
+     ('گیلکی'),
+     ('ગુજરાતી'),
+     ('Hak-kâ-ngî / 客家語'),
+     ('Hausa'),
+     ('Hornjoserbsce'),
+     ('Ido'),
+     ('Igbo'),
+     ('Ilokano'),
+     ('Interlingua'),
+     ('Interlingue'),
+     ('Ирон'),
+     ('Íslenska'),
+     ('Jawa'),
+     ('ಕನ್ನಡ'),
+     ('Kapampangan'),
+     ('ភាសាខ្មែរ'),
+     ('Kotava'),
+     ('Kreyòl Ayisyen'),
+     ('Kurdî / كوردی'),
+     ('کوردیی ناوەندی'),
+     ('Кыргызча'),
+     ('Кырык мары'),
+     ('Lëtzebuergesch'),
+     ('Lìgure'),
+     ('Limburgs'),
+     ('Lombard'),
+     ('मैथिली'),
+     ('മലയാളം'),
+     ('მარგალური'),
+     ('مازِرونی'),
+     ('Mìng-dĕ̤ng-ngṳ̄ / 閩東語'),
+     ('Монгол'),
+     ('Napulitano'),
+     ('नेपाल भाषा'),
+     ('Nordfriisk'),
+     ('Occitan'),
+     ('Олык марий'),
+     ('ଓଡି଼ଆ'),
+     ('অসমীযা়'),
+     ('ਪੰਜਾਬੀ'),
+     ('پنجابی (شاہ مکھی)'),
+     ('پښتو'),
+     ('Piemontèis'),
+     ('Plattdüütsch'),
+     ('Qaraqalpaqsha'),
+     ('Qırımtatarca'),
+     ('Runa Simi'),
+     ('Русиньскый'),
+     ('संस्कृतम्'),
+     ('ᱥᱟᱱᱛᱟᱲᱤ'),
+     ('سرائیکی'),
+     ('Саха Тыла'),
+     ('Scots'),
+     ('ChiShona'),
+     ('Sicilianu'),
+     ('සිංහල'),
+     ('سنڌي'),
+     ('Ślůnski'),
+     ('Basa Sunda'),
+     ('Taclḥit'),
+     ('Tagalog'),
+     ('ၽႃႇသႃႇတႆး'),
+     ('ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ'),
+     ('tolışi'),
+     ('chiTumbuka'),
+     ('Basa Ugi'),
+     ('Vèneto'),
+     ('Volapük'),
+     ('Walon'),
+     ('文言'),
+     ('吴语'),
+     ('ייִדיש'),
+     ('Yorùbá'),
+     ('Zazaki'),
+     ('žemaitėška'),
+     ('isiZulu'),
+     ('नेपाली'),
+     ('ꯃꯤꯇꯩ ꯂꯣꯟ'),
+     ('Dzhudezmo / לאדינו'),
+     ('Адыгэбзэ'),
+     ('Ænglisc'),
+     ('Anarâškielâ'),
+     ('अंगिका'),
+     ('Аԥсшәа'),
+     ('armãneashti'),
+     ('Arpitan'),
+     ('atikamekw'),
+     ('ܐܬܘܪܝܐ'),
+     ('Avañe’ẽ'),
+     ('Авар'),
+     ('Aymar'),
+     ('Batak Toba'),
+     ('Betawi'),
+     ('भोजपुरी'),
+     ('Bislama'),
+     ('བོད་ཡིག'),
+     ('Буряад'),
+     ('Chavacano de Zamboanga'),
+     ('Chichewa'),
+     ('Corsu'),
+     ('Vahcuengh / 話僮'),
+     ('Dagaare'),
+     ('Davvisámegiella'),
+     ('Deitsch'),
+     ('ދިވެހިބަސް'),
+     ('Dolnoserbski'),
+     ('Dusun Bundu-liwan'),
+     ('Эрзянь'),
+     ('Estremeñu'),
+     ('Eʋegbe'),
+     ('Farefare'),
+     ('Fɔ̀ngbè'),
+     ('Furlan'),
+     ('Gaelg'),
+     ('Gagauz'),
+     ('ГӀалгӀай'),
+     ('Ghanaian Pidgin'),
+     ('Gĩkũyũ'),
+     ('赣语 / 贛語'),
+     ('Gungbe'),
+     ('Хальмг'),
+     ('ʻŌlelo Hawaiʻi'),
+     ('Ikinyarwanda'),
+     ('Jaku Iban'),
+     ('Kabɩyɛ'),
+     ('Yerwa Kanuri'),
+     ('Kaszëbsczi'),
+     ('Kernewek'),
+     ('Коми'),
+     ('Перем коми'),
+     ('Kongo'),
+     ('कोंकणी / Konknni'),
+     ('كٲشُر'),
+     ('Kriyòl Gwiyannen'),
+     ('Kumoring'),
+     ('Kʋsaal'),
+     ('ພາສາລາວ'),
+     ('Лакку'),
+     ('Latgaļu'),
+     ('Лезги'),
+     ('Li Niha'),
+     ('Lingála'),
+     ('Lingua Franca Nova'),
+     ('livvinkarjala'),
+     ('lojban'),
+     ('Luganda'),
+     ('Madhurâ'),
+     ('Malti'),
+     ('Mandailing'),
+     ('Māori'),
+     ('Mfantse'),
+     ('Mirandés'),
+     ('Мокшень'),
+     ('ဘာသာ မန်'),
+     ('Moore'),
+     ('ߒߞߏ'),
+     ('Na Vosa Vaka-Viti'),
+     ('Nāhuatlahtōlli'),
+     ('Naijá'),
+     ('Nedersaksisch'),
+     ('Nouormand / Normaund'),
+     ('Novial'),
+     ('Afaan Oromoo'),
+     ('ပအိုဝ်ႏဘာႏသာႏ'),
+     ('Pangasinán'),
+     ('Pangcah'),
+     ('Papiamentu'),
+     ('Patois'),
+     ('Pfälzisch'),
+     ('Picard'),
+     ('Къарачай–малкъар'),
+     ('Ripoarisch'),
+     ('Rumantsch'),
+     ('Sakizaya'),
+     ('Gagana Sāmoa'),
+     ('Sardu'),
+     ('Seediq'),
+     ('Seeltersk'),
+     ('Sesotho'),
+     ('Sesotho sa Leboa'),
+     ('Setswana'),
+     ('ꠍꠤꠟꠐꠤ'),
+     ('Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ'),
+     ('Soomaaliga'),
+     ('Sranantongo'),
+     ('SiSwati'),
+     ('Reo tahiti'),
+     ('Taqbaylit'),
+     ('Tarandíne'),
+     ('Tayal'),
+     ('Tetun'),
+     ('Tok Pisin'),
+     ('faka Tonga'),
+     ('Türkmençe'),
+     ('Twi'),
+     ('Tyap'),
+     ('Тыва дыл'),
+     ('Удмурт'),
+     ('ئۇيغۇرچه'),
+     ('Vepsän'),
+     ('võro'),
+     ('West-Vlams'),
+     ('Wolof'),
+     ('isiXhosa'),
+     ('Zeêuws'),
+     ('алтай тил'),
+     ('अवधी'),
+     ('डोटेली'),
+     ('ತುಳು'),
+     ('ရခိုင်'),
+     ('Bajau Sama'),
+     ('Bamanankan'),
+     ('Chamoru'),
+     ('རྫོང་ཁ'),
+     ('𐌲𐌿𐍄𐌹𐍃𐌺'),
+     ('Igala'),
+     ('ᐃᓄᒃᑎᑐᑦ / Inuktitut'),
+     ('Iñupiak'),
+     ('isiNdebele seSewula'),
+     ('Kalaallisut'),
+     ('Nupe'),
+     ('Obolo'),
+     ('पालि'),
+     ('pinayuanan'),
+     ('Ποντιακά'),
+     ('romani čhib'),
+     ('Ikirundi'),
+     ('руски'),
+     ('Sängö'),
+     ('ᥖᥭᥰᥖᥬᥳᥑᥨᥒᥰ'),
+     ('ትግርኛ'),
+     ('Thuɔŋjäŋ'),
+     ('ᏣᎳᎩ'),
+     ('Tsėhesenėstsestotse'),
+     ('Xitsonga'),
+     ('Tshivenḓa'),
+     ('Wayuunaiki'),
+     ('адыгабзэ');
+   COMMIT;
+}
+
+do_test 1.2 {
+  set res \n[db format -style box {
+    SELECT name, rowid AS id FROM language
+     WHERE length(name)=2
+     ORDER BY name
+  }]
+  set exp {
+┌──────┬─────┐
+│ name │ id  │
+├──────┼─────┤
+│ 中文 │  18 │
+│ 吴语 │ 173 │
+│ 文言 │ 172 │
+│ 粵語 │  75 │
+└──────┴─────┘
+}
+  if {$res ne $exp} {
+    puts [list $res]
+    puts [list $exp]
+  }
+  string compare $res $exp
+} {0}
+
+do_test 1.3 {
+  set res \n[db format -style box {
+    SELECT name, rowid AS id FROM language
+     WHERE length(name)=3
+     ORDER BY name
+  }]
+  set exp {
+┌────────┬─────┐
+│  name  │ id  │
+├────────┼─────┤
+│ Ido    │ 108 │
+│ Twi    │ 297 │
+│ ߒߞߏ    │ 258 │
+│ ᏣᎳᎩ    │ 335 │
+│ 日本語 │  10 │
+│ 한국어 │  37 │
+└────────┴─────┘
+}
+  if {$res ne $exp} {
+    puts [list $res]
+    puts [list $exp]
+  }
+  string compare $res $exp
+} {0}
+
+do_test 1.4 {
+  set res \n[db format -style box {
+    SELECT name, rowid AS id FROM language
+     WHERE length(name)=4
+     ORDER BY name
+  }]
+  set exp {
+┌──────┬─────┐
+│ name │ id  │
+├──────┼─────┤
+│ Igbo │ 109 │
+│ Jawa │ 115 │
+│ Nupe │ 323 │
+│ Tyap │ 298 │
+│ võro │ 303 │
+│ Авар │ 192 │
+│ Ирон │ 113 │
+│ Коми │ 231 │
+│ اردو │  74 │
+│ سنڌي │ 159 │
+│ مصرى │   8 │
+│ پښتو │ 144 │
+│ अवधी │ 309 │
+│ पालि │ 325 │
+│ ತುಳು │ 311 │
+│ ትግርኛ │ 333 │
+│ አማርኛ │  78 │
+└──────┴─────┘
+}
+  if {$res ne $exp} {
+    puts [list $res]
+    puts [list $exp]
+  }
+  string compare $res $exp
+} {0}
+
+do_test 1.5 {
+  set res \n[db format -style box {
+    SELECT name, rowid AS id FROM language
+     WHERE length(name)=5
+     ORDER BY name
+  }]
+  set exp {
+┌───────┬─────┐
+│ name  │ id  │
+├───────┼─────┤
+│ Aymar │ 193 │
+│ Corsu │ 202 │
+│ Dansk │  31 │
+│ Eesti │  32 │
+│ Frysk │  99 │
+│ Gaelg │ 216 │
+│ Hausa │ 106 │
+│ Igala │ 318 │
+│ Kongo │ 233 │
+│ Ladin │  44 │
+│ Malti │ 250 │
+│ Moore │ 257 │
+│ Māori │ 252 │
+│ Naijá │ 261 │
+│ Obolo │ 324 │
+│ Sardu │ 278 │
+│ Scots │ 155 │
+│ Shqip │  21 │
+│ Suomi │  65 │
+│ Sängö │ 331 │
+│ Tayal │ 292 │
+│ Tetun │ 293 │
+│ Walon │ 171 │
+│ Wolof │ 305 │
+│ Лакку │ 240 │
+│ Лезги │ 242 │
+│ руски │ 330 │
+│ עברית │  42 │
+│ فارسی │   5 │
+│ كٲشُر  │ 235 │
+│ گیلکی │ 103 │
+│ मराठी │  51 │
+│ বাংলা │  26 │
+│ ଓଡି଼ଆ   │ 140 │
+│ தமிழ்  │  67 │
+│ ಕನ್ನಡ  │ 116 │
+│ සිංහල  │ 158 │
+│ ꠍꠤꠟꠐꠤ │ 284 │
+└───────┴─────┘
+}
+  if {$res ne $exp} {
+    puts [list $res]
+    puts [list $exp]
+  }
+  string compare $res $exp
+} {0}
+
+do_test 1.6 {
+  set res \n[db format -style box {
+    SELECT name, rowid AS id FROM language
+     WHERE length(name)=6
+     ORDER BY name
+  }]
+  set exp {
+┌────────┬─────┐
+│  name  │ id  │
+├────────┼─────┤
+│ Betawi │ 195 │
+│ Català │  28 │
+│ Eʋegbe │ 212 │
+│ Furlan │ 215 │
+│ Gagauz │ 217 │
+│ Galego │  36 │
+│ Gungbe │ 222 │
+│ Gĩkũyũ │ 220 │
+│ Kabɩyɛ │ 227 │
+│ Kotava │ 119 │
+│ Kʋsaal │ 238 │
+│ Latina │  45 │
+│ Lìgure │ 126 │
+│ Magyar │  48 │
+│ Novial │ 264 │
+│ Patois │ 270 │
+│ Picard │ 272 │
+│ Polski │  11 │
+│ Română │  59 │
+│ Seediq │ 279 │
+│ Türkçe │  73 │
+│ Vepsän │ 302 │
+│ Vèneto │ 169 │
+│ Yorùbá │ 175 │
+│ Zazaki │ 176 │
+│ Zeêuws │ 307 │
+│ lojban │ 247 │
+│ tolışi │ 166 │
+│ Аԥсшәа │ 186 │
+│ Буряад │ 199 │
+│ Монгол │ 134 │
+│ Тоҷикӣ │  71 │
+│ Удмурт │ 300 │
+│ Хальмг │ 223 │
+│ Эрзянь │ 210 │
+│ ייִדיש  │ 174 │
+│ تۆرکجه │  72 │
+│ ܐܬܘܪܝܐ │ 190 │
+│ अंगिका  │ 185 │
+│ डोटेली  │ 310 │
+│ नेपाली  │ 179 │
+│ मैथिली  │ 129 │
+│ हिन्दी  │  39 │
+│ ਪੰਜਾਬੀ  │ 142 │
+│ తెలుగు  │  69 │
+│ മലയാളം │ 130 │
+│ རྫོང་ཁ   │ 316 │
+│ ရခိုင်    │ 312 │
+└────────┴─────┘
+}
+  if {$res ne $exp} {
+    puts [list $res]
+    puts [list $exp]
+  }
+  string compare $res $exp
+} {0}
+
+finish_test