| # 2025-11-05 |
| # |
| # 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 qrf01 |
| |
| do_execsql_test 1.0 { |
| CREATE TABLE t1(a, b, c); |
| INSERT INTO t1 VALUES(1,2.5,'three'),(x'424c4f42',NULL,'Ἀμήν'); |
| } |
| |
| do_test 1.10 { |
| set result "\n[db format {SELECT * FROM t1}]" |
| } { |
| ┌──────┬─────┬───────┐ |
| │ a │ b │ c │ |
| ├──────┼─────┼───────┤ |
| │ 1 │ 2.5 │ three │ |
| │ BLOB │ │ Ἀμήν │ |
| └──────┴─────┴───────┘ |
| } |
| do_test 1.11a { |
| set result "\n[db format -title off {SELECT * FROM t1}]" |
| } { |
| ┌──────┬─────┬───────┐ |
| │ 1 │ 2.5 │ three │ |
| │ BLOB │ │ Ἀμήν │ |
| └──────┴─────┴───────┘ |
| } |
| do_test 1.11b { |
| set result "\n[db format -text sql {SELECT * FROM t1}]" |
| } { |
| ┌─────────────┬─────┬─────────┐ |
| │ a │ b │ c │ |
| ├─────────────┼─────┼─────────┤ |
| │ 1 │ 2.5 │ 'three' │ |
| │ x'424c4f42' │ │ 'Ἀμήν' │ |
| └─────────────┴─────┴─────────┘ |
| } |
| do_test 1.11c { |
| set result "\n[db format -text sql -border off {SELECT * FROM t1}]" |
| } { |
| a │ b │ c |
| ─────────────┼─────┼───────── |
| 1 │ 2.5 │ 'three' |
| x'424c4f42' │ │ 'Ἀμήν' |
| } |
| do_test 1.12 { |
| set result "\n[db format -text csv {SELECT * FROM t1}]" |
| } { |
| ┌────────────────────┬─────┬────────┐ |
| │ a │ b │ c │ |
| ├────────────────────┼─────┼────────┤ |
| │ 1 │ 2.5 │ three │ |
| │ "\102\114\117\102" │ │ "Ἀμήν" │ |
| └────────────────────┴─────┴────────┘ |
| } |
| do_test 1.13 { |
| set result "\n[db format -text csv -blob hex {SELECT * FROM t1}]" |
| } { |
| ┌──────────┬─────┬────────┐ |
| │ a │ b │ c │ |
| ├──────────┼─────┼────────┤ |
| │ 1 │ 2.5 │ three │ |
| │ 424c4f42 │ │ "Ἀμήν" │ |
| └──────────┴─────┴────────┘ |
| } |
| do_test 1.14 { |
| catch {db format -text unk -blob hex {SELECT * FROM t1}} res |
| set res |
| } {bad -text "unk": must be auto, csv, html, json, plain, sql, or tcl} |
| do_test 1.15 { |
| catch {db format -text sql -blob unk {SELECT * FROM t1}} res |
| set res |
| } {bad BLOB encoding (-blob) "unk": must be auto, hex, json, tcl, text, sql, or size} |
| do_test 1.16 { |
| catch {db format -text sql -style unk {SELECT * FROM t1}} res |
| set res |
| } {bad format style (-style) "unk": must be auto, box, column, count, csv, eqp, explain, html, insert, jobject, json, line, list, markdown, quote, stats, stats-est, stats-vm, or table} |
| |
| |
| do_test 1.20 { |
| set result "\n[db format -style box {SELECT * FROM t1}]" |
| } { |
| ┌──────┬─────┬───────┐ |
| │ a │ b │ c │ |
| ├──────┼─────┼───────┤ |
| │ 1 │ 2.5 │ three │ |
| │ BLOB │ │ Ἀμήν │ |
| └──────┴─────┴───────┘ |
| } |
| |
| do_test 1.30 { |
| set result "\n[db format -style table {SELECT * FROM t1}]" |
| } { |
| +------+-----+-------+ |
| | a | b | c | |
| +------+-----+-------+ |
| | 1 | 2.5 | three | |
| | BLOB | | Ἀμήν | |
| +------+-----+-------+ |
| } |
| do_test 1.31 { |
| set result "\n[db format -style table -title off {SELECT * FROM t1}]" |
| } { |
| +------+-----+-------+ |
| | 1 | 2.5 | three | |
| | BLOB | | Ἀμήν | |
| +------+-----+-------+ |
| } |
| do_test 1.32 { |
| set result "\n[db format -style table -border off {SELECT * FROM t1}]" |
| } { |
| a | b | c |
| ------+-----+------- |
| 1 | 2.5 | three |
| BLOB | | Ἀμήν |
| } |
| do_test 1.33 { |
| set result "\n[db format -style table -border off \ |
| -screenwidth 15 \ |
| {SELECT * FROM t1}]" |
| } { |
| a | b | c |
| ----+---+----- |
| 1|2.5|three |
| BLOB| |Ἀμήν |
| } |
| do_test 1.34 { |
| set result "\n[db format -style box -border off \ |
| -screenwidth 30 \ |
| {SELECT * FROM t1}]" |
| } { |
| a │ b │ c |
| ──────┼─────┼─────── |
| 1 │ 2.5 │ three |
| BLOB │ │ Ἀμήν |
| } |
| do_test 1.35 { |
| set result "\n[db format -style box -border off \ |
| -screenwidth 15 \ |
| {SELECT * FROM t1}]" |
| } { |
| a │ b │ c |
| ────┼───┼───── |
| 1│2.5│three |
| BLOB│ │Ἀμήν |
| } |
| |
| do_test 1.40 { |
| set result "\n[db format -style column {SELECT * FROM t1}]" |
| } { |
| a b c |
| ---- --- ----- |
| 1 2.5 three |
| BLOB Ἀμήν |
| } |
| do_test 1.41 { |
| set result "\n[db format -style column -title off {SELECT * FROM t1}]" |
| } { |
| 1 2.5 three |
| BLOB Ἀμήν |
| } |
| |
| do_test 1.50 { |
| db format -style count {SELECT * FROM t1} |
| } 2 |
| |
| do_test 1.60a { |
| db format -style list -columnsep , -rowsep \r\n -text csv -blob tcl {SELECT * FROM t1} |
| } "1,2.5,three\r\n\"\\102\\114\\117\\102\",,\"Ἀμήν\"\r\n" |
| do_test 1.60b { |
| db format -style csv -columnsep xyz -rowsep pqr -text sql -blob sql {SELECT * FROM t1} |
| } "1,2.5,three\r\nx'424c4f42',,\"Ἀμήν\"\r\n" |
| do_test 1.61a { |
| db format -style list -columnsep , -rowsep \r\n -text csv -title auto -blob tcl {SELECT * FROM t1} |
| } "a,b,c\r\n1,2.5,three\r\n\"\\102\\114\\117\\102\",,\"Ἀμήν\"\r\n" |
| do_test 1.61b { |
| db format -style csv -title auto -blob tcl {SELECT * FROM t1} |
| } "a,b,c\r\n1,2.5,three\r\n\"\\102\\114\\117\\102\",,\"Ἀμήν\"\r\n" |
| do_test 1.62a { |
| db format -style list -columnsep , -rowsep \r\n -text csv -title csv -blob tcl {SELECT a AS 'a x y', b, c FROM t1} |
| } "\"a x y\",b,c\r\n1,2.5,three\r\n\"\\102\\114\\117\\102\",,\"Ἀμήν\"\r\n" |
| do_test 1.62b { |
| db format -style csv -title csv -blob tcl {SELECT a AS 'a x y', b, c FROM t1} |
| } "\"a x y\",b,c\r\n1,2.5,three\r\n\"\\102\\114\\117\\102\",,\"Ἀμήν\"\r\n" |
| |
| do_test 1.70 { |
| set result "\n[db format -style html {SELECT * FROM t1}]" |
| } { |
| <TR> |
| <TD>1 |
| <TD>2.5 |
| <TD>three |
| </TR> |
| <TR> |
| <TD>BLOB |
| <TD>null |
| <TD>Ἀμήν |
| </TR> |
| } |
| do_test 1.71 { |
| set result "\n[db format -style html -title auto {SELECT * FROM t1}]" |
| } { |
| <TR> |
| <TH>a |
| <TH>b |
| <TH>c |
| </TR> |
| <TR> |
| <TD>1 |
| <TD>2.5 |
| <TD>three |
| </TR> |
| <TR> |
| <TD>BLOB |
| <TD>null |
| <TD>Ἀμήν |
| </TR> |
| } |
| |
| do_test 1.80 { |
| set result "\n[db format -style insert {SELECT * FROM t1}]" |
| } { |
| INSERT INTO tab VALUES(1,2.5,'three'); |
| INSERT INTO tab VALUES(x'424c4f42',NULL,'Ἀμήν'); |
| } |
| do_test 1.81 { |
| set result "\n[db format -style insert -tablename t1 {SELECT * FROM t1}]" |
| } { |
| INSERT INTO t1 VALUES(1,2.5,'three'); |
| INSERT INTO t1 VALUES(x'424c4f42',NULL,'Ἀμήν'); |
| } |
| do_test 1.82 { |
| set result "\n[db format -style insert -tablename t1 -title auto \ |
| {SELECT * FROM t1}]" |
| } { |
| INSERT INTO t1(a,b,c) VALUES(1,2.5,'three'); |
| INSERT INTO t1(a,b,c) VALUES(x'424c4f42',NULL,'Ἀμήν'); |
| } |
| do_test 1.83 { |
| set result "\n[db format -style insert -tablename drop -title on \ |
| {SELECT a AS "a-b", b, c AS "123" FROM t1}]" |
| } { |
| INSERT INTO "drop"("a-b",b,"123") VALUES(1,2.5,'three'); |
| INSERT INTO "drop"("a-b",b,"123") VALUES(x'424c4f42',NULL,'Ἀμήν'); |
| } |
| |
| do_test 1.90 { |
| set result "\n[db format -style json {SELECT * FROM t1}]" |
| } { |
| [{"a":1,"b":2.5,"c":"three"}, |
| {"a":"\u0042\u004c\u004f\u0042","b":null,"c":"Ἀμήν"}] |
| } |
| do_test 1.91 { |
| set result "\n[db format -style jobject {SELECT * FROM t1}]" |
| } { |
| {"a":1,"b":2.5,"c":"three"} |
| {"a":"\u0042\u004c\u004f\u0042","b":null,"c":"Ἀμήν"} |
| } |
| do_test 1.92 { |
| set result "\n[db format -style jobject {SELECT *, unistr('abc\u000a123\u000d\u000axyz') AS xyz FROM t1}]" |
| } { |
| {"a":1,"b":2.5,"c":"three","xyz":"abc\n123\r\nxyz"} |
| {"a":"\u0042\u004c\u004f\u0042","b":null,"c":"Ἀμήν","xyz":"abc\n123\r\nxyz"} |
| } |
| |
| do_test 1.100 { |
| set result "\n[db format -style line {SELECT * FROM t1}]" |
| } { |
| a = 1 |
| b = 2.5 |
| c = three |
| |
| a = BLOB |
| b = |
| c = Ἀμήν |
| } |
| do_test 1.101 { |
| set result "\n[db format -style line -null (NULL) {SELECT * FROM t1}]" |
| } { |
| a = 1 |
| b = 2.5 |
| c = three |
| |
| a = BLOB |
| b = (NULL) |
| c = Ἀμήν |
| } |
| do_test 1.102 { |
| set result "\n[db format -style line -null (NULL) \ |
| -text sql {SELECT * FROM t1}]" |
| } { |
| a = 1 |
| b = 2.5 |
| c = 'three' |
| |
| a = x'424c4f42' |
| b = (NULL) |
| c = 'Ἀμήν' |
| } |
| |
| do_test 1.110 { |
| set result "\n[db format -style list {SELECT * FROM t1}]" |
| } { |
| 1|2.5|three |
| BLOB||Ἀμήν |
| } |
| do_test 1.111 { |
| set result "\n[db format -style list -title on {SELECT * FROM t1}]" |
| } { |
| a|b|c |
| 1|2.5|three |
| BLOB||Ἀμήν |
| } |
| do_test 1.112 { |
| set result "\n[db format -style list -title on -text sql -null NULL \ |
| -title plain {SELECT * FROM t1}]" |
| } { |
| a|b|c |
| 1|2.5|'three' |
| x'424c4f42'|NULL|'Ἀμήν' |
| } |
| do_test 1.118 { |
| set rc [catch {db format -style list -title unk {SELECT * FROM t1}} res] |
| lappend rc $res |
| } {1 {bad -title "unk": must be off, on, auto, csv, html, json, plain, sql, or tcl}} |
| |
| |
| do_test 1.120 { |
| set result "\n[db format -style markdown {SELECT * FROM t1}]" |
| } { |
| | a | b | c | |
| |------|-----|-------| |
| | 1 | 2.5 | three | |
| | BLOB | | Ἀμήν | |
| } |
| do_test 1.121 { |
| set result "\n[db format -style markdown -title off {SELECT * FROM t1}]" |
| } { |
| | 1 | 2.5 | three | |
| | BLOB | | Ἀμήν | |
| } |
| |
| do_test 1.130 { |
| set result "\n[db format -style quote {SELECT * FROM t1}]" |
| } { |
| 1,2.5,'three' |
| x'424c4f42',NULL,'Ἀμήν' |
| } |
| do_test 1.131 { |
| set result "\n[db format -style quote -title on {SELECT * FROM t1}]" |
| } { |
| 'a','b','c' |
| 1,2.5,'three' |
| x'424c4f42',NULL,'Ἀμήν' |
| } |
| |
| |
| do_execsql_test 2.0 { |
| DELETE FROM t1; |
| INSERT INTO t1 VALUES(1,2,'The quick fox jumps over the lazy brown dog.'); |
| } |
| do_test 2.1 { |
| set result "\n[db format -widths {5 -5 19} -wordwrap on \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬─────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼─────────────────────┤ |
| │ 1 │ 2 │ The quick fox jumps │ |
| │ │ │ over the lazy brown │ |
| │ │ │ dog. │ |
| └───────┴───────┴─────────────────────┘ |
| } |
| do_test 2.2 { |
| set result "\n[db format -widths {5 -5 19} -wordwrap off \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬─────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼─────────────────────┤ |
| │ 1 │ 2 │ The quick fox jumps │ |
| │ │ │ over the lazy brown │ |
| │ │ │ dog. │ |
| └───────┴───────┴─────────────────────┘ |
| } |
| do_test 2.3 { |
| set result "\n[db format -widths {5 -5 18} -wordwrap on \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼────────────────────┤ |
| │ 1 │ 2 │ The quick fox │ |
| │ │ │ jumps over the │ |
| │ │ │ lazy brown dog. │ |
| └───────┴───────┴────────────────────┘ |
| } |
| do_test 2.4 { |
| set result "\n[db format -widths {5 -5 -18} -wordwrap on \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼────────────────────┤ |
| │ 1 │ 2 │ The quick fox │ |
| │ │ │ jumps over the │ |
| │ │ │ lazy brown dog. │ |
| └───────┴───────┴────────────────────┘ |
| } |
| do_test 2.5 { |
| set result "\n[db format -widths {5 -5 19} -wordwrap off \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬─────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼─────────────────────┤ |
| │ 1 │ 2 │ The quick fox jumps │ |
| │ │ │ over the lazy brown │ |
| │ │ │ dog. │ |
| └───────┴───────┴─────────────────────┘ |
| } |
| do_test 2.6 { |
| set result "\n[db format -widths {5 -5 18} -wordwrap off \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼────────────────────┤ |
| │ 1 │ 2 │ The quick fox jump │ |
| │ │ │ s over the lazy br │ |
| │ │ │ own dog. │ |
| └───────┴───────┴────────────────────┘ |
| } |
| do_test 2.7 { |
| set result "\n[db format -widths {5 5 18} -wordwrap yes \ |
| -align {left center right} -titlealign right \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼────────────────────┤ |
| │ 1 │ 2 │ The quick fox │ |
| │ │ │ jumps over the │ |
| │ │ │ lazy brown dog. │ |
| └───────┴───────┴────────────────────┘ |
| } |
| do_test 2.8 { |
| set result "\n[db format -widths {5 8 11} -wordwrap yes \ |
| -align {auto auto center} -titlealign left \ |
| -defaultalign right \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬──────────┬─────────────┐ |
| │ a │ b │ c │ |
| ├───────┼──────────┼─────────────┤ |
| │ 1 │ 2 │ The quick │ |
| │ │ │ fox jumps │ |
| │ │ │ over the │ |
| │ │ │ lazy brown │ |
| │ │ │ dog. │ |
| └───────┴──────────┴─────────────┘ |
| } |
| do_test 2.9 { |
| catch {db format -align {auto xyz 123} {SELECT * FROM t1}} res |
| set res |
| } {bad column alignment (-align) "xyz": must be auto, bottom, c, center, e, left, middle, n, ne, nw, right, s, se, sw, top, or w} |
| do_test 2.10 { |
| catch {db format -defaultalign xyz {SELECT * FROM t1}} res |
| set res |
| } {bad default alignment (-defaultalign) "xyz": must be auto, bottom, c, center, e, left, middle, n, ne, nw, right, s, se, sw, top, or w} |
| do_test 2.11 { |
| catch {db format -titlealign xyz {SELECT * FROM t1}} res |
| set res |
| } {bad title alignment (-titlealign) "xyz": must be auto, bottom, c, center, e, left, middle, n, ne, nw, right, s, se, sw, top, or w} |
| |
| |
| do_execsql_test 2.30 { |
| UPDATE t1 SET c='Η γρήγορη αλεπού πηδάει πάνω από το τεμπέλικο καφέ σκυλί'; |
| SELECT hex(c) FROM t1; |
| } {CE9720CEB3CF81CEAECEB3CEBFCF81CEB720CEB1CEBBCEB5CF80CEBFCF8D20CF80CEB7CEB4CEACCEB5CEB920CF80CEACCEBDCF8920CEB1CF80CF8C20CF84CEBF20CF84CEB5CEBCCF80CEADCEBBCEB9CEBACEBF20CEBACEB1CF86CEAD20CF83CEBACF85CEBBCEAF} |
| do_test 2.31 { |
| set result "\n[db format -widths {5 -5 18} -wordwrap on \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼────────────────────┤ |
| │ 1 │ 2 │ Η γρήγορη αλεπού │ |
| │ │ │ πηδάει πάνω από το │ |
| │ │ │ τεμπέλικο καφέ │ |
| │ │ │ σκυλί │ |
| └───────┴───────┴────────────────────┘ |
| } |
| do_test 2.32 { |
| set result "\n[db format -widths {5 5 18} -align {left center center} -wordwrap on \ |
| {SELECT * FROM t1}]" |
| } { |
| ┌───────┬───────┬────────────────────┐ |
| │ a │ b │ c │ |
| ├───────┼───────┼────────────────────┤ |
| │ 1 │ 2 │ Η γρήγορη αλεπού │ |
| │ │ │ πηδάει πάνω από το │ |
| │ │ │ τεμπέλικο καφέ │ |
| │ │ │ σκυλί │ |
| └───────┴───────┴────────────────────┘ |
| } |
| |
| |
| do_execsql_test 3.0 { |
| DELETE FROM t1; |
| INSERT INTO t1 VALUES(1,2,unistr('abc\u001b[1;31m123\u001b[0mxyz')); |
| } |
| do_test 3.1 { |
| set result "\n[db format {SELECT * FROM t1}]" |
| } { |
| ┌───┬───┬────────────────────────┐ |
| │ a │ b │ c │ |
| ├───┼───┼────────────────────────┤ |
| │ 1 │ 2 │ abc^[[1;31m123^[[0mxyz │ |
| └───┴───┴────────────────────────┘ |
| } |
| do_test 3.2 { |
| set result "\n[db format -esc off {SELECT * FROM t1}]" |
| string map [list \033 X] $result |
| } { |
| ┌───┬───┬───────────┐ |
| │ a │ b │ c │ |
| ├───┼───┼───────────┤ |
| │ 1 │ 2 │ abcX[1;31m123X[0mxyz │ |
| └───┴───┴───────────┘ |
| } |
| do_test 3.3 { |
| set result "\n[db format -esc symbol {SELECT * FROM t1}]" |
| } { |
| ┌───┬───┬──────────────────────┐ |
| │ a │ b │ c │ |
| ├───┼───┼──────────────────────┤ |
| │ 1 │ 2 │ abc␛[1;31m123␛[0mxyz │ |
| └───┴───┴──────────────────────┘ |
| } |
| do_test 3.4 { |
| set result "\n[db format -esc ascii {SELECT * FROM t1}]" |
| } { |
| ┌───┬───┬────────────────────────┐ |
| │ a │ b │ c │ |
| ├───┼───┼────────────────────────┤ |
| │ 1 │ 2 │ abc^[[1;31m123^[[0mxyz │ |
| └───┴───┴────────────────────────┘ |
| } |
| do_test 3.5 { |
| catch {db format -esc unk {SELECT * FROM t1}} res |
| set res |
| } {bad control character escape (-esc) "unk": must be ascii, auto, off, or symbol} |
| |
| do_execsql_test 4.0 { |
| DELETE FROM t1; |
| INSERT INTO t1 VALUES(json('{a:5,b:6}'), jsonb('{c:1,d:2}'), 99); |
| } |
| do_test 4.1 { |
| set result "\n[db format -text sql {SELECT * FROM t1}]" |
| } { |
| ┌─────────────────┬───────────────────────┬────┐ |
| │ a │ b │ c │ |
| ├─────────────────┼───────────────────────┼────┤ |
| │ '{"a":5,"b":6}' │ x'8c1763133117641332' │ 99 │ |
| └─────────────────┴───────────────────────┴────┘ |
| } |
| do_test 4.2 { |
| set result "\n[db format -text sql -textjsonb on {SELECT * FROM t1}]" |
| } { |
| ┌─────────────────┬────────────────────────┬────┐ |
| │ a │ b │ c │ |
| ├─────────────────┼────────────────────────┼────┤ |
| │ '{"a":5,"b":6}' │ jsonb('{"c":1,"d":2}') │ 99 │ |
| └─────────────────┴────────────────────────┴────┘ |
| } |
| do_test 4.3 { |
| set result "\n[db format -text plain -textjsonb on -wrap 11 \ |
| {SELECT a AS json, b AS jsonb, c AS num FROM t1}]" |
| } { |
| ┌─────────────┬─────────────┬─────┐ |
| │ json │ jsonb │ num │ |
| ├─────────────┼─────────────┼─────┤ |
| │ {"a":5,"b": │ {"c":1,"d": │ 99 │ |
| │ 6} │ 2} │ │ |
| └─────────────┴─────────────┴─────┘ |
| } |
| |
| do_execsql_test 5.0 { |
| DROP TABLE t1; |
| CREATE TABLE t1(name, mtime, value); |
| INSERT INTO t1 VALUES |
| ('entry-one',1708791504,zeroblob(300)), |
| (unistr('one\u000atwo\u000athree'),1333206973,NULL), |
| ('sample-jsonb',1333101221,jsonb('{ |
| "alpha":53.11688723, |
| "beta":"qrfWidthPrint(p, p->pOut, -p->u.sLine.mxColWth);", |
| "zeta":[15,null,1333206973,"fd8ffe000104a46494600010101"]}')); |
| } |
| do_test 5.1 { |
| set sql {SELECT name, mtime, datetime(mtime,'unixepoch') AS time, |
| value FROM t1 ORDER BY mtime} |
| set result "\n[db format -style line -screenwidth 60 -blob sql \ |
| -text sql -wordwrap off -linelimit 77 $sql]" |
| } { |
| name = 'sample-jsonb' |
| mtime = 1333101221 |
| time = '2012-03-30 09:53:41' |
| value = x'cc7c57616c706861b535332e31313638383732334762657461 |
| c73071726657696474685072696e7428702c20702d3e704f7574 |
| 2c202d702d3e752e734c696e652e6d78436f6c577468293b477a |
| 657461cb2c23313500a331333333323036393733c71b66643866 |
| 6665303030313034613436343934363030303130313031' |
| |
| name = unistr('one\u000atwo\u000athree') |
| mtime = 1333206973 |
| time = '2012-03-31 15:16:13' |
| value = |
| |
| name = 'entry-one' |
| mtime = 1708791504 |
| time = '2024-02-24 16:18:24' |
| value = x'00000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 000000000000000000000000000000' |
| } |
| do_test 5.2 { |
| set sql {SELECT name, mtime, datetime(mtime,'unixepoch') AS time, |
| value FROM t1 ORDER BY mtime} |
| set result "\n[db format -style line -screenwidth 60 -blob sql \ |
| -text plain -esc off -textjsonb yes \ |
| -wordwrap yes -linelimit 3 $sql]" |
| } { |
| name = sample-jsonb |
| mtime = 1333101221 |
| time = 2012-03-30 09:53:41 |
| value = {"alpha":53.11688723,"beta":"qrfWidthPrint(p, |
| p->pOut, -p->u.sLine.mxColWth);","zeta":[15,null, |
| 1333206973,"fd8ffe000104a46494600010101"]} |
| |
| name = one |
| two |
| three |
| mtime = 1333206973 |
| time = 2012-03-31 15:16:13 |
| value = |
| |
| name = entry-one |
| mtime = 1708791504 |
| time = 2024-02-24 16:18:24 |
| value = x'00000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| 0000000000000000000000000000000000000000000000000000 |
| ... |
| } |
| do_test 5.3a { |
| set result "\n[db format -style box -widths {0 10 10 14}\ |
| -align {left right right center} \ |
| -blob sql \ |
| -text plain -esc off -textjsonb no \ |
| -wordwrap yes -linelimit 2 $sql]" |
| } { |
| ┌──────────────┬────────────┬────────────┬────────────────┐ |
| │ name │ mtime │ time │ value │ |
| ├──────────────┼────────────┼────────────┼────────────────┤ |
| │ sample-jsonb │ 1333101221 │ 2012-03-30 │ x'cc7c57616c70 │ |
| │ │ │ 09:53:41 │ 6861b535332e31 │ |
| │ │ │ │ ... │ |
| ├──────────────┼────────────┼────────────┼────────────────┤ |
| │ one │ 1333206973 │ 2012-03-31 │ │ |
| │ two │ │ 15:16:13 │ │ |
| │ ... │ │ │ │ |
| ├──────────────┼────────────┼────────────┼────────────────┤ |
| │ entry-one │ 1708791504 │ 2024-02-24 │ x'000000000000 │ |
| │ │ │ 16:18:24 │ 00000000000000 │ |
| │ │ │ │ ... │ |
| └──────────────┴────────────┴────────────┴────────────────┘ |
| } |
| do_test 5.3b { |
| set result "\n[db format -style table -widths {0 10 10 14}\ |
| -align {center right right right} \ |
| -blob sql \ |
| -text plain -esc off -textjsonb no \ |
| -wordwrap yes -linelimit 2 $sql]" |
| } { |
| +--------------+------------+------------+----------------+ |
| | name | mtime | time | value | |
| +--------------+------------+------------+----------------+ |
| | sample-jsonb | 1333101221 | 2012-03-30 | x'cc7c57616c70 | |
| | | | 09:53:41 | 6861b535332e31 | |
| | | | | ... | |
| +--------------+------------+------------+----------------+ |
| | one | 1333206973 | 2012-03-31 | | |
| | two | | 15:16:13 | | |
| | ... | | | | |
| +--------------+------------+------------+----------------+ |
| | entry-one | 1708791504 | 2024-02-24 | x'000000000000 | |
| | | | 16:18:24 | 00000000000000 | |
| | | | | ... | |
| +--------------+------------+------------+----------------+ |
| } |
| do_test 5.3c { |
| set result "\n[db format -style column -widths {0 10 10 14}\ |
| -align {center right right right} \ |
| -blob sql \ |
| -text plain -esc off -textjsonb no \ |
| -wordwrap yes -linelimit 2 $sql]" |
| } { |
| name mtime time value |
| ------------ ---------- ---------- -------------- |
| sample-jsonb 1333101221 2012-03-30 x'cc7c57616c70 |
| 09:53:41 6861b535332e31 |
| ... |
| |
| one 1333206973 2012-03-31 |
| two 15:16:13 |
| ... |
| |
| entry-one 1708791504 2024-02-24 x'000000000000 |
| 16:18:24 00000000000000 |
| ... |
| } |
| do_test 5.4 { |
| db eval { |
| CREATE TABLE t2(a,b,c,d,e); |
| WITH v(x) AS (SELECT 'abcdefghijklmnopqrstuvwxyz') |
| INSERT INTO t2 SELECT x,x,x,x,x FROM v; |
| } |
| set sql {SELECT char(0x61,0xa,0x62,0xa,0x63,0xa,0x64) a, |
| mtime b, mtime c, mtime d, mtime e FROM t1} |
| set result "\n[db format -style box -widths {1 2 3 4 5}\ |
| -linelimit 3 -wordwrap off {SELECT *, 'x' AS x FROM t2}]" |
| } { |
| ┌────┬────┬─────┬──────┬───────┬───┐ |
| │ a │ b │ c │ d │ e │ x │ |
| ├────┼────┼─────┼──────┼───────┼───┤ |
| │ ab │ ab │ abc │ abcd │ abcde │ x │ |
| │ cd │ cd │ def │ efgh │ fghij │ │ |
| │ ef │ ef │ ghi │ ijkl │ klmno │ │ |
| │ .. │ .. │ ... │ ... │ ... │ │ |
| └────┴────┴─────┴──────┴───────┴───┘ |
| } |
| |
| do_execsql_test 6.0 { |
| DELETE FROM t2; |
| INSERT INTO t2 VALUES |
| (1, 2.5, 'three', x'342028666f757229', null); |
| } |
| do_test 6.1a { |
| set result "\n[db format -style list -null NULL \ |
| -text tcl -columnsep , \ |
| {SELECT * FROM t2}]" |
| } { |
| 1,2.5,"three","\064\040\050\146\157\165\162\051",NULL |
| } |
| |
| do_execsql_test 7.0 { |
| CREATE TABLE t7(a,b); |
| INSERT INTO t7 VALUES('abcdefghijklmnop', |
| 'abcぁdefかghiのjklはmnop'); |
| } |
| do_test 7.1 { |
| set result "\n[db format -style list -charlimit 13 \ |
| {SELECT * FROM t7}]" |
| } { |
| abcdefghijklm...|abcぁdefかghi... |
| } |
| do_test 7.2 { |
| set result "\n[db format -style list -charlimit 14 \ |
| {SELECT * FROM t7}]" |
| } { |
| abcdefghijklmn...|abcぁdefかghi... |
| } |
| do_test 7.3 { |
| set result "\n[db format -style list -charlimit 15 \ |
| {SELECT * FROM t7}]" |
| } { |
| abcdefghijklmno...|abcぁdefかghiの... |
| } |
| do_test 7.4 { |
| set result "\n[db format -style list -charlimit 16 \ |
| {SELECT * FROM t7}]" |
| } { |
| abcdefghijklmnop|abcぁdefかghiのj... |
| } |
| |
| do_test 8.0 { |
| set result "\n[db format -style table { |
| WITH c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<10) |
| SELECT 'aaa' AS 'a', format('%.*c',n,'b')||char(9)||'xx' AS x FROM c}]" |
| } { |
| +-----+--------------------+ |
| | a | x | |
| +-----+--------------------+ |
| | aaa | b xx | |
| | aaa | bb xx | |
| | aaa | bbb xx | |
| | aaa | bbbb xx | |
| | aaa | bbbbb xx | |
| | aaa | bbbbbb xx | |
| | aaa | bbbbbbb xx | |
| | aaa | bbbbbbbb xx | |
| | aaa | bbbbbbbbb xx | |
| | aaa | bbbbbbbbbb xx | |
| +-----+--------------------+ |
| } |
| do_test 8.1 { |
| set result "\n[db format -style table { |
| WITH c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<10) |
| SELECT 'aaaa' AS 'a', format('%.*c',n,'b')||char(9)||'xx' AS x FROM c}]" |
| } { |
| +------+--------------------+ |
| | a | x | |
| +------+--------------------+ |
| | aaaa | b xx | |
| | aaaa | bb xx | |
| | aaaa | bbb xx | |
| | aaaa | bbbb xx | |
| | aaaa | bbbbb xx | |
| | aaaa | bbbbbb xx | |
| | aaaa | bbbbbbb xx | |
| | aaaa | bbbbbbbb xx | |
| | aaaa | bbbbbbbbb xx | |
| | aaaa | bbbbbbbbbb xx | |
| +------+--------------------+ |
| } |
| do_test 8.3 { |
| set result "\n[db format -style table -esc off { |
| WITH c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<15) |
| SELECT 'aaa' AS 'a',n, 'xx'||char(n)||'yy' AS xy FROM c |
| WHERE n NOT IN (8,10,13,14)}]" |
| } { |
| +-----+----+------------+ |
| | a | n | xy | |
| +-----+----+------------+ |
| | aaa | 1 | xx␁yy | |
| | aaa | 2 | xx␂yy | |
| | aaa | 3 | xx␃yy | |
| | aaa | 4 | xx␄yy | |
| | aaa | 5 | xx␅yy | |
| | aaa | 6 | xx␆yy | |
| | aaa | 7 | xx␇yy | |
| | aaa | 9 | xx yy | |
| | aaa | 11 | xx␋yy | |
| | aaa | 12 | xx␌yy | |
| | aaa | 15 | xx␏yy | |
| +-----+----+------------+ |
| } |
| do_test 8.4 { |
| set result "\n[db format -style table -esc off { |
| WITH c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<15) |
| SELECT 'aaa' AS 'a',n, 'xx'||char(n)||'yy'||char(9)||'zz' AS xyz FROM c |
| WHERE n NOT IN (8,10,13,14)}]" |
| } { |
| +-----+----+--------------------+ |
| | a | n | xyz | |
| +-----+----+--------------------+ |
| | aaa | 1 | xx␁yy zz | |
| | aaa | 2 | xx␂yy zz | |
| | aaa | 3 | xx␃yy zz | |
| | aaa | 4 | xx␄yy zz | |
| | aaa | 5 | xx␅yy zz | |
| | aaa | 6 | xx␆yy zz | |
| | aaa | 7 | xx␇yy zz | |
| | aaa | 9 | xx yy zz | |
| | aaa | 11 | xx␋yy zz | |
| | aaa | 12 | xx␌yy zz | |
| | aaa | 15 | xx␏yy zz | |
| +-----+----+--------------------+ |
| } |
| |
| do_test 9.1 { |
| db eval { |
| CREATE TABLE t9(x); |
| INSERT INTO t9 VALUES |
| (x'4331323334'), |
| (x'c30431323334'), |
| (x'd3000431323334'), |
| (x'e30000000431323334'), |
| (x'f3000000000000000431323334'); |
| } |
| db format -style list -text plain -rowsep , -textjsonb on \ |
| {SELECT * FROM t9} |
| } {1234,1234,1234,1234,1234,} |
| do_test 9.2 { |
| db format -style list -text sql -rowsep , -textjsonb on \ |
| {SELECT * FROM t9} |
| } {jsonb('1234'),jsonb('1234'),jsonb('1234'),jsonb('1234'),jsonb('1234'),} |
| do_test 9.3 { |
| db format -style json {SELECT * FROM t9 WHERE rowid<0} |
| } {} |
| do_test 9.4 { |
| db format -style jobject {SELECT * FROM t9 WHERE rowid<0} |
| } {} |
| |
| do_test 10.1 { |
| db eval { |
| DROP TABLE IF EXISTS t1; |
| CREATE TABLE t1(x); |
| INSERT INTO t1(x) VALUES |
| ('alice'), |
| ('bob'), |
| ('cinderella-cinderella'), |
| ('daniel'), |
| ('emma'), |
| ('fred'), |
| ('gertrude'), |
| ('harold'), |
| ('ingrid'), |
| ('jake'), |
| ('lisa'), |
| ('mike'), |
| ('nina'), |
| ('octavian'), |
| ('paula'), |
| ('quintus'), |
| ('rita'), |
| ('sam'), |
| ('tammy'), |
| ('ulysses'), |
| ('violet'), |
| ('william'), |
| ('xanthippe'), |
| ('yates'), |
| ('zoe'); |
| } |
| set result "\n[db format -style column -title off -screenwidth 41 -splitcolumn on \ |
| {SELECT x FROM t1}]" |
| } { |
| alice octavian |
| bob paula |
| cinderella-cinderella quintus |
| daniel rita |
| emma sam |
| fred tammy |
| gertrude ulysses |
| harold violet |
| ingrid william |
| jake xanthippe |
| lisa yates |
| mike zoe |
| nina |
| } |
| do_test 10.2 { |
| set result "\n[db format -style column -title off -screenwidth 42 -splitcolumn on \ |
| {SELECT x FROM t1}]" |
| } { |
| alice jake tammy |
| bob lisa ulysses |
| cinderella-cinderella mike violet |
| daniel nina william |
| emma octavian xanthippe |
| fred paula yates |
| gertrude quintus zoe |
| harold rita |
| ingrid sam |
| } |
| do_test 10.3 { |
| set result "\n[db format -style column -title off -screenwidth 51 -splitcolumn on \ |
| {SELECT x FROM t1}]" |
| } { |
| alice harold paula william |
| bob ingrid quintus xanthippe |
| cinderella-cinderella jake rita yates |
| daniel lisa sam zoe |
| emma mike tammy |
| fred nina ulysses |
| gertrude octavian violet |
| } |
| do_test 10.4 { |
| set result "\n[db format -style column -title off -screenwidth 61 -splitcolumn on \ |
| {SELECT x FROM t1}]" |
| } { |
| alice fred lisa quintus violet |
| bob gertrude mike rita william |
| cinderella-cinderella harold nina sam xanthippe |
| daniel ingrid octavian tammy yates |
| emma jake paula ulysses zoe |
| } |
| do_test 10.5 { |
| set result "\n[db format -style column -title off -screenwidth 74 -splitcolumn on \ |
| {SELECT x FROM t1}]" |
| } { |
| alice emma ingrid nina rita violet zoe |
| bob fred jake octavian sam william |
| cinderella-cinderella gertrude lisa paula tammy xanthippe |
| daniel harold mike quintus ulysses yates |
| } |
| |
| do_test 11.1 { |
| set result "\n[db format -style table -blob size {SELECT randomblob(1234)}]" |
| } { |
| +------------------+ |
| | randomblob(1234) | |
| +------------------+ |
| | (1234-byte blob) | |
| +------------------+ |
| } |
| |
| db close |
| |
| finish_test |