short int nWrap; /* Wrap columns wider than this */
short int nScreenWidth; /* Maximum overall table width */
short int nLineLimit; /* Maximum number of lines for any row */
+ short int nTitleLimit; /* Maximum number of characters in a title */
int nCharLimit; /* Maximum number of characters in a cell */
int nWidth; /* Number of entries in aWidth[] */
int nAlign; /* Number of entries in aAlignment[] */
Instead, it substitutes a text string that says how many bytes
the BLOB contains.
-### 2.8 Maximum size of displayed content (nLineLimit, nCharLimit)
+### 2.8 Maximum size of displayed content (nLineLimit, nCharLimit, nTitleLimit)
If the sqlite3_qrf_spec.nCharLimit setting is non-zero, then the formatter
will display only the first nCharLimit characters of each value.
when doing a query that (unexpectedly) contains very large text or
blob values: perhaps megabyes of text.
+If the sqlite3_qrf_spec.nTitleLimit is non-zero, then the formatter
+attempts to limits the size of column titles to at most nTitleLimit
+display characters in width and a single line of text. The nTitleLimit
+is useful for queries that have result columns that are scalar
+subqueries or complex expressions. If those columns lack an AS
+clause, then the name of the column will be a copy of the expression
+that defines the column, which in some queries can be hundreds of
+characters and multiple lines in length, which can reduce the readability
+of tabular displays. An nTitleLimit somewhere in the range of 10 to
+20 can improve readability.
+
### 2.9 Word Wrapping In Columnar Styles (nWrap, bWordWrap)
When using columnar formatting modes (QRF_STYLE_Box, QRF_STYLE_Column,
union {
struct { /* Content for QRF_STYLE_Line */
int mxColWth; /* Maximum display width of any column */
- const char **azCol; /* Names of output columns (MODE_Line) */
+ char **azCol; /* Names of output columns (MODE_Line) */
} sLine;
qrfEQPGraph *pGraph; /* EQP graph (Eqp, Stats, and StatsEst) */
struct { /* Content for QRF_STYLE_Explain */
}
}
+/*
+** Adjust the input string zIn[] such that it is no more than N display
+** characters wide. If it is wider than that, then truncate and add
+** ellipsis. Or if zIn[] contains a \r or \n, truncate at that point,
+** adding ellipsis. Embedded tabs in zIn[] are converted into ordinary
+** spaces.
+**
+** Return this display width of the modified title string.
+*/
+static int qrfTitleLimit(char *zIn, int N){
+ unsigned char *z = (unsigned char*)zIn;
+ int n = 0;
+ unsigned char *zEllipse = 0;
+ while( z[0] ){
+ if( z[0]<' ' ){
+ int k;
+ if( z[0]=='\033' && (k = qrfIsVt100(z))>0 ){
+ z += k;
+ }else if( z[0]=='\t' ){
+ z[0] = ' ';
+ }else if( z[0]=='\n' || z[0]=='\r' ){
+ z[0] = ' ';
+ }else{
+ z++;
+ }
+ }else if( (0x80&z[0])==0 ){
+ if( n>=(N-3) && zEllipse==0 ) zEllipse = z;
+ if( n==N ){ z[0] = 0; break; }
+ n++;
+ z++;
+ }else{
+ int u = 0;
+ int len = sqlite3_qrf_decode_utf8(z, &u);
+ if( n+len>(N-3) && zEllipse==0 ) zEllipse = z;
+ if( n+len>N ){ z[0] = 0; break; }
+ z += len;
+ n += sqlite3_qrf_wcwidth(u);
+ }
+ }
+ if( zEllipse ) memcpy(zEllipse,"...",4);
+ return n;
+}
+
+
/*
** Render value pVal into pOut
*/
qrfEncodeText(p, pStr, z ? z : "");
n = sqlite3_str_length(pStr);
z = data.az[data.n] = sqlite3_str_finish(pStr);
- data.aiWth[data.n] = w = qrfDisplayWidth(z, n, &nNL);
+ if( p->spec.nTitleLimit ){
+ nNL = 0;
+ data.aiWth[data.n] = w = qrfTitleLimit(data.az[data.n],
+ p->spec.nTitleLimit );
+ }else{
+ data.aiWth[data.n] = w = qrfDisplayWidth(z, n, &nNL);
+ }
data.n++;
if( w>data.a[i].mxW ) data.a[i].mxW = w;
if( nNL ) data.bMultiRow = 1;
sqlite3_str *pVal;
int mxW;
int bWW;
+ int nSep;
if( p->u.sLine.azCol==0 ){
p->u.sLine.azCol = sqlite3_malloc64( p->nCol*sizeof(char*) );
if( p->u.sLine.azCol==0 ){
p->u.sLine.mxColWth = 0;
for(i=0; i<p->nCol; i++){
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";
+ const char *zCName = sqlite3_column_name(p->pStmt, i);
+ if( zCName==0 ) zCName = "unknown";
+ p->u.sLine.azCol[i] = sqlite3_mprintf("%s", zCName);
+ if( p->spec.nTitleLimit>0 ){
+ (void)qrfTitleLimit(p->u.sLine.azCol[i], p->spec.nTitleLimit);
+ }
sz = (int)sqlite3_qrf_wcswidth(p->u.sLine.azCol[i]);
if( sz > p->u.sLine.mxColWth ) p->u.sLine.mxColWth = sz;
}
}
if( p->nRow ) sqlite3_str_append(p->pOut, "\n", 1);
pVal = sqlite3_str_new(p->db);
- mxW = p->mxWidth - (3 + p->u.sLine.mxColWth);
+ nSep = (int)strlen(p->spec.zColumnSep);
+ mxW = p->mxWidth - (nSep + p->u.sLine.mxColWth);
bWW = p->spec.bWordWrap==QRF_Yes;
for(i=0; i<p->nCol; i++){
const char *zVal;
int cnt = 0;
qrfWidthPrint(p, p->pOut, -p->u.sLine.mxColWth, p->u.sLine.azCol[i]);
- sqlite3_str_append(p->pOut, " = ", 3);
+ sqlite3_str_append(p->pOut, p->spec.zColumnSep, nSep);
qrfRenderValue(p, pVal, i);
zVal = sqlite3_str_value(pVal);
if( zVal==0 ) zVal = "";
}
break;
}
+ case QRF_STYLE_Line: {
+ if( p->spec.zColumnSep==0 ){
+ p->spec.zColumnSep = ": ";
+ }
+ break;
+ }
case QRF_STYLE_Csv: {
p->spec.eStyle = QRF_STYLE_List;
p->spec.eText = QRF_TEXT_Csv;
break;
}
case QRF_STYLE_Line: {
- if( p->u.sLine.azCol ) sqlite3_free(p->u.sLine.azCol);
+ if( p->u.sLine.azCol ){
+ int i;
+ for(i=0; i<p->nCol; i++) sqlite3_free(p->u.sLine.azCol[i]);
+ sqlite3_free(p->u.sLine.azCol);
+ }
break;
}
case QRF_STYLE_Stats:
short int nWrap; /* Wrap columns wider than this */
short int nScreenWidth; /* Maximum overall table width */
short int nLineLimit; /* Maximum number of lines for any row */
+ short int nTitleLimit; /* Maximum number of characters in a title */
int nCharLimit; /* Maximum number of characters in a cell */
int nWidth; /* Number of entries in aWidth[] */
int nAlign; /* Number of entries in aAlignment[] */
-C In\sfts5,\savoid\sholding\san\sopen\sblob\shandle\safter\san\sINSERT/UPDATE/DELETE\sstatement,\sas\sthis\scan\sinterfere\swith\ssqlite3_interrupt().\sForum\spost\s[forum:/forumpost/95413eb410\s|\s95413eb410].
-D 2025-12-09T13:41:01.298
+C Add\sthe\snTitleLimit\soption\sto\sQRF.\s\sAlso\schange\s"line"\sstyle\sso\sthat\sit\nuses\szColumnSep\sas\sthe\sdivider\sbetween\sthe\stitle\sand\sthe\svalue.
+D 2025-12-10T15:24:46.290
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F ext/misc/windirent.h 02211ce51f3034c675f2dbf4d228194d51b3ee05734678bad5106fff6292e60c
F ext/misc/zipfile.c d792ed9b936ddfe9a210ecc893352afaee306c63b084187f6e44951f6f669e21
F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee
-F ext/qrf/README.md e726cff56c5c8a3aa493d15b6c052834cb6b5f1ca612867bc1cc6a11be8f019b
+F ext/qrf/README.md af1c7faf239625cf27a3a0e8c9d78af4e0da8e4d887223141182bc87bfbd22c8
F ext/qrf/dev-notes.md e68a6d91ce4c7eb296ef2daadc2bb79c95c317ad15b9fafe40850c67b29c2430
-F ext/qrf/qrf.c 7fb2c4b600fcba4439a3ce8f7aed95f726f15548ce375b78cd983388a0ecebf7
-F ext/qrf/qrf.h 0f0387eb4c56eaa46405cd640132624933377e46df3d2baa940392f9a7d35768
+F ext/qrf/qrf.c 03191b452a83aa970f43f0e3bac25082e1f5b71da5cab2f547789fa5fb0fbf28
+F ext/qrf/qrf.h 2ac14b0aaacf44636d8c81051bfeab4afae50a98fbb2e10ff5aed0c28a87b2b2
F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8
F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255
F ext/rbu/rbu10.test 7c22caa32c2ff26983ca8320779a31495a6555737684af7aba3daaf762ef3363
F src/resolve.c 8d53771eb51a4ab5f970150c3a70969d8db79cd04a8774c2d296bbcf471a0dd0
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c 344518c1bba9c4636bf651b7642304abd2e7075ba35feb4bae42a51e5efe991f
-F src/shell.c.in 5eb15c585bd49b8cce88e762353a92b470b99a95e459bb434da41576a4f1b6eb
+F src/shell.c.in fe95f5121a2a05ce3b5f9582a3d96d77f6d148cb784c5c4f2f78f26a4ed9ab19
F src/sqlite.h.in 706cacea5308b0244fb6cec92e08310fb427a125375c64137cc1f878ae4cf5c0
F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
F src/sqlite3ext.h 5d5330f5f8461f5ce74960436ddcfa53ecd09c2b8b23901e22ae38aec3243998
F src/sqliteLimit.h 7e705474d59912388832cc5465edbc0dbb552872e23452812846e90d280987f3
F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
-F src/tclsqlite.c 1411438584e8e08c0959e6341acb0487039de662dab223ae0fef26d361211b6e
+F src/tclsqlite.c 85b5a20df96016e5d1d8fdc68c8a4c279c5b93e2049b77cd806c2cc50b9d8c56
F src/tclsqlite.h 614b3780a62522bc9f8f2b9fb22689e8009958e7aa77e572d0f3149050af348a
F src/test1.c 0e71fbcb484a271564e98e0158192c28c24f5521594218c3ba48bcb4cf634f91
F src/test2.c 62f0830958f9075692c29c6de51b495ae8969e1bef85f239ffcd9ba5fb44a5ff
F test/mmapcorrupt.test 470fb44fe92e99c1d23701d156f8c17865f5b027063c9119dcfdb842791f4465
F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3
F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3
-F test/modeA.clitest 96939c5fac8595213d84de82f3e09e4d126bafed19ec30167953627f4afa1723
+F test/modeA.clitest c06845925e37a4aeaadcc9f4878127cc8b5500e848c5bebdcd167a84ad8d55c9
F test/multiplex.test d74c034e52805f6de8cc5432cef8c9eb774bb64ec29b83a22effc8ca4dac1f08
F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a
F test/multiplex3.test fac575e0b1b852025575a6a8357701d80933e98b5d2fe6d35ddaa68f92f6a1f7
F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
F test/pushdown.test 46a626ef1c0ca79b85296ff2e078b9da20a50e9b804b38f441590c3987580ddd
-F test/qrf01.test 7ad8bb08eaaf9dee2a76a807741dfe4d6752614baa3c03afc734580bccc59afa
+F test/qrf01.test c464a5c72bcb11377d25ba955bfde47eae6332e1c00fcc97a6a1ca996d8fe11b
F test/qrf02.test 39b4afdc000bedccdafc0aecf17638df67a67aaa2d2942865ae6abcc48ba0e92
F test/qrf03.test e7efe46d204671726b4707585126cd78d107368de4a7d0c7b8d5157cdd8624ed
F test/qrf04.test 0894692c998d2401dcc33449c02051b503ecce0c94217be54fb007c82d2d1379
F test/shell2.test 9d55aa53ca36c6889dedf5a23d849793afbd2dbe62d512ce066cb293a8a66a88
F test/shell3.test 840192774cc4edf7653520c0434a311c7477b9bc324abbc7bd2887915792fa8c
F test/shell4.test e25580a792b7b54560c3a76b6968bd8189261f38979fe28e6bc6312c5db280db
-F test/shell5.test 7a249400bb2af59ac8524f357f8cf2844a62b6ac5ff8ecd69b045ceb688700ae
+F test/shell5.test 145a9474bab6d80b6ee452b83135507b25275d53b0936aab76520f007ac4d9dc
F test/shell6.test e3b883b61d4916b6906678a35f9d19054861123ad91b856461e0a456273bdbb8
F test/shell7.test 43fd8e511c533bab5232e95c7b4be93b243451709e89582600d4b6e67693d5c3
F test/shell8.test 641cf21a99c59404c24e3062923734951c4099a6b6b6520de00cf7a1249ee871
F test/shell9.test 8742a5b390cdcef6369f5aa223e415aa4255a4129ef249b177887dc635a87209
-F test/shellA.test 5fa0bdb7a19b0c1ba32649eab3eca0f7164bd9d33d391fff17586abcbc6c6e18
+F test/shellA.test 6319e4ede6658aa71b8d5265bf96071bcccdafe93853b56e670f64345a590029
F test/shellB.test de879b1ea7c25daf1a06b2c882b45a5d002e6580c81c57169ce47084cc6afb6b
F test/shmlock.test 9f1f729a7fe2c46c88b156af819ac9b72c0714ac6f7246638a73c5752b5fd13c
F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 939275c6c574a3354e0626164aab1a005998f811c53a66b078249d6b2fcbd68e
-R 286d8b5aad9d68a56a5f96ea87c4c7dc
-U dan
-Z 7641cdfba34b6b7502af4bf575815d5f
+P f88e1d03573f394fc7caf60704c96152717b3fe8be4eef0caeb64737054f0fd2
+R ffbc5a3c90afd01d69ca06bdb0522a1b
+T *branch * title-limit
+T *sym-title-limit *
+T -sym-trunk *
+U drh
+Z 42a92002f07a36f7c65671dbf43f2ad5
# Remove this line to create a well-formed Fossil manifest.
-branch trunk
-tag trunk
+branch title-limit
+tag title-limit
-f88e1d03573f394fc7caf60704c96152717b3fe8be4eef0caeb64737054f0fd2
+d67a299c86ff80ed67857d2546b0edaf852cb23dbfbc15e24793d1c4860a2e50
static const char *aModeStr[] =
/* 0 1 2 3 4 5 6 7 8 */
{ 0, "\n", "|", " ", ",", "\r\n", "\036", "\037", "\t",
- "", "NULL", "null", "\"\"" };
- /* 9 10 11 12 */
+ "", "NULL", "null", "\"\"", ": ", };
+ /* 9 10 11 12 13 */
static const ModeInfo aModeInfo[] = {
/* zName eCSep eRSep eNull eText eHdr eBlob bHdr eStyle eCx mFlg */
{ "jatom", 4, 1, 11, 6, 6, 0, 1, 12, 0, 0 },
{ "jobject", 0, 1, 11, 6, 6, 0, 0, 10, 0, 0 },
{ "json", 0, 0, 11, 6, 6, 0, 0, 9, 0, 0 },
- { "line", 0, 1, 9, 1, 1, 0, 0, 11, 1, 0 },
+ { "line", 13, 1, 9, 1, 1, 0, 0, 11, 1, 0 },
{ "list", 2, 1, 9, 1, 1, 0, 1, 12, 0, 0 },
{ "markdown", 0, 0, 9, 1, 1, 0, 2, 13, 2, 0 },
{ "off", 0, 0, 0, 0, 0, 0, 0, 14, 0, 0 },
p->mode.spec.nCharLimit = 300;
p->mode.spec.nLineLimit = 5;
p->mode.spec.bTextJsonb = QRF_Yes;
+ p->mode.spec.nTitleLimit = 20;
p->mode.mFlags = mFlags;
}
}
** --title ARG Whether or not to show column headers, and if so
** how to encode them. ARG can be "off", "on",
** "sql", "csv", "html", "tcl", or "json".
+** --titlelimit N Limit the length of column titles to N characters.
** -v|--verbose Verbose output
** --widths LIST Set the columns widths for columnar modes. The
** argument is a list of integers, one for each
p->mode.spec.bBorder = k & 0x3;
}
chng = 1;
- }else if( 0<=(k=pickStr(z,0,"-charlimit","-linelimit","")) ){
+ }else if( 0<=(k=pickStr(z,0,"-charlimit","-linelimit","-titlelimit","")) ){
int w; /* 0 1 */
if( i+1>=nArg ){
dotCmdError(p, i, "missing argument", 0);
return 1;
}
w = integerValue(azArg[++i]);
- if( k==0 ){
- p->mode.spec.nCharLimit = w;
- }else{
- p->mode.spec.nLineLimit = w;
+ switch( k ){
+ case 0: p->mode.spec.nCharLimit = w; break;
+ case 1: p->mode.spec.nLineLimit = w; break;
+ default: p->mode.spec.nTitleLimit = w; break;
}
chng = 1;
}else if( 0<=(k=pickStr(z,0,"-tablename","-rowsep","-colsep","-null","")) ){
sqlite3_str_appendf(pDesc," --textjsonb %s",
p->mode.spec.bTextJsonb==QRF_Yes ? "on" : "off");
}
+ if( bAll || p->mode.spec.nTitleLimit>0 ){
+ sqlite3_str_appendf(pDesc, " --titlelimit %d", p->mode.spec.nTitleLimit);
+ }
k = modeTitleDsply(p, bAll);
if( k==1 ){
sqlite3_str_appendall(pDesc, " --titles off");
** -screenwidth NUMBER Width of the display TTY
** -linelimit NUMBER Max lines for any cell
** -charlimit NUMBER Content truncated to this size
+** -titlelimit NUMBER Max width of column titles
** -align LIST-OF-ALIGNMENT Alignment of columns
** -widths LIST-OF-NUMBERS Widths for individual columns
** -columnsep TEXT Column separator text
** -screenwidth nScreenWidth
** -linelimit nLineLimit
** -charlimit nCharLimit
+** -titlelimit nTitleLimit
** -align nAlign, aAlign
** -widths nWidth, aWidth
** -columnsep zColumnSep
}else if( strcmp(zArg,"-wrap")==0
|| strcmp(zArg,"-screenwidth")==0
|| strcmp(zArg,"-linelimit")==0
+ || strcmp(zArg,"-titlelimit")==0
){
int v = 0;
rc = Tcl_GetIntFromObj(pDb->interp, objv[i+1], &v);
qrf.nWrap = v;
}else if( zArg[1]=='s' ){
qrf.nScreenWidth = v;
+ }else if( zArg[1]=='t' ){
+ qrf.nTitleLimit = v;
}else{
qrf.nLineLimit = v;
}
.output memory
.mode
.output --verify END
-current output mode: qbox --limits 5,300 --quote relaxed --screenwidth auto --textjsonb on
+current output mode: qbox --limits 5,300 --quote relaxed --screenwidth auto --textjsonb on --titlelimit 20
END
.output memory
.mode -v
.output --verify END
-current output mode: qbox --align "" --border on --blob-quote auto --colsep "" --escape auto --limits 5,300 --null "NULL" --quote relaxed --rowsep "" --screenwidth auto --tablename "" --textjsonb on --titles on --widths "" --wordwrap off --wrap 10
+current output mode: qbox --align "" --border on --blob-quote auto --colsep "" --escape auto --limits 5,300 --null "NULL" --quote relaxed --rowsep "" --screenwidth auto --tablename "" --textjsonb on --titlelimit 20 --titles on --widths "" --wordwrap off --wrap 10
END
.output memory --error-prefix "Error:"
do_test 1.100 {
set result "\n[db format -style line {SELECT * FROM t1}]"
} {
-a = 1
-b = 2.5
-c = three
+a: 1
+b: 2.5
+c: three
-a = BLOB
-b =
-c = Ἀμήν
+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: 1
+b: 2.5
+c: three
-a = BLOB
-b = (NULL)
-c = Ἀμήν
+a: BLOB
+b: (NULL)
+c: Ἀμήν
}
do_test 1.102 {
- set result "\n[db format -style line -null (NULL) \
+ set result "\n[db format -style line -null (NULL) -columnsep { = } \
-text sql {SELECT * FROM t1}]"
} {
a = 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]"
+ -text sql -wordwrap off -linelimit 77 \
+ -columnsep { = } $sql]"
} {
name = 'sample-jsonb'
mtime = 1333101221
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 \
+ -text plain -esc off -textjsonb yes -columnsep { = }\
-wordwrap yes -linelimit 3 $sql]"
} {
name = sample-jsonb
close $out
forcedelete test.db
catchcmd test.db {.import -csv shell5.csv t1
-.mode line
+.mode line --colsep ' = '
SELECT * FROM t1;}
} {1 { ? = 0
x_02 = x2
"z" to "z_05",
"z" to "z_08"}}
-do_test shell5-5.1 {
+do_test shell5-5.1b {
set out [open shell5.csv w]
fconfigure $out -translation lf
puts $out {"COW","cow","CoW","cOw"}
catchcmd test.db {.import -csv shell5.csv t1
.mode line
SELECT * FROM t1;}
-} {1 {COW_1 = uuu
-cow_2 = lll
-CoW_3 = ulu
-cOw_4 = lul
+} {1 {COW_1: uuu
+cow_2: lll
+CoW_3: ulu
+cOw_4: lul
Columns renamed during .import shell5.csv due to duplicates:
"COW" to "COW_1",
"cow" to "cow_2",
close $out
forcedelete test.db
catchcmd test.db {.import -csv shell5.csv t1
-.mode line
+.mode line --colsep " = "
SELECT * FROM t1;}
} {0 { あい = 1
うえお = 2}}
catchcmd test.db {.import -csv shell5.csv t1
.mode line
SELECT * FROM t1;}
-} {0 {1 = あい
-2 = うえお}}
+} {0 {1: あい
+2: うえお}}
# 2024-03-11 https://sqlite.org/forum/forumpost/ca014d7358
# Import into a table that contains computed columns.
exec {*}$CLI -noinit test.db --line --escape symbol \
{SELECT a, x FROM t1 WHERE a IN (1,2,6,7,8)}
} {
- a = 1
- x = line with ' single quote
+ a: 1
+ x: line with ' single quote
- a = 2
- x = ␛[31mVT-100 codes␛[0m
+ a: 2
+ x: ␛[31mVT-100 codes␛[0m
- a = 6
- x = new
-line
+ a: 6
+ x: new
+ line
- a = 7
- x = carriage␍return
+ a: 7
+ x: carriage␍return
- a = 8
- x = last line
+ a: 8
+ x: last line
}
do_test shellA-3.2 {
exec {*}$CLI -noinit test.db --line --escape ascii \
{SELECT a, x FROM t1 WHERE a IN (1,2,6,7,8)}
} {
- a = 1
- x = line with ' single quote
+ a: 1
+ x: line with ' single quote
- a = 2
- x = ^[[31mVT-100 codes^[[0m
+ a: 2
+ x: ^[[31mVT-100 codes^[[0m
- a = 6
- x = new
-line
+ a: 6
+ x: new
+ line
- a = 7
- x = carriage^Mreturn
+ a: 7
+ x: carriage^Mreturn
- a = 8
- x = last line
+ a: 8
+ x: last line
}
# ".mode box"