unsigned char eEsc; /* How to escape control characters in text */
unsigned char eText; /* Quoting style for text */
unsigned char eBlob; /* Quoting style for BLOBs */
- unsigned char bColumnNames; /* QRF_SW_On to show column names */
+ unsigned char bColumnNames; /* True to show column names */
unsigned char bWordWrap; /* Try to wrap on word boundaries */
unsigned char bTextJsonb; /* Render JSONB blobs as JSON text */
- short int mxWidth; /* Maximum width of any column */
+ short int mxColWidth; /* Maximum width of any individual column */
+ short int mxTotalWidth; /* Maximum overall table width */
+ int mxLength; /* Maximum content to display per element */
int nWidth; /* Number of column width parameters */
short int *aWidth; /* Column widths */
const char *zColumnSep; /* Alternative column separator */
const char *zTableName; /* Output table name */
const char *zNull; /* Rendering of NULL */
char *(*xRender)(void*,sqlite3_value*); /* Render a value */
- ssize_t (*xWrite)(void*,const unsigned char*,size_t); /* Write callback */
+ sqlite3_int64 (*xWrite)(void*,const unsigned char*,sqlite3_int64);
void *pRenderArg; /* First argument to the xRender callback */
void *pWriteArg; /* First argument to the xWrite callback */
char **pzOutput; /* Storage location for output string */
previous paragraph would be shown as
`"\u0005\u0028\u0081\u00f3"`.
-### 2.8 Word Wrapping In Columnar Modes (mxWidth and bWordWrap)
+### 2.8 Maximum displayed content length (mxLength)
+
+If the sqlite3_qrf_spec.mxLength setting is non-zero, then the formatter
+*attempts* to show only the first mxLength characters of each value.
+This limit is approximate. The content length might exceed the limit
+by a few characters, especially if the limit is very small.
+
+Content length limits only apply to TEXT and BLOB values. Numeric
+values and NULLs always display their full text regardless of the
+mxLength setting.
+
+### 2.9 Word Wrapping In Columnar Modes (mxColWidth, mxTotalWidth, bWordWrap)
When using columnar formatting modes (QRF_STYLE_Box, QRF_STYLE_Column,
-QRF_STYLE_Markdown, or QRF_STYLE_Table) and with sqlite3_qrf_spec.mxWidth
-set to some non-zero value, then when an output is too wide to be
-displayed in just mxWidth standard character widths, the output is
-split into multiple lines, where each line is a maximum of
-mxWidth characters wide. "Width" hear means the actual displayed
-width of the text in a fixed-pitch font. The code takes into account
-zero-width and double-width characters when computing the display width.
-
-If the sqlite3_qrf_spec.bWordWrap flag is set to QRF_SW_On,
-then the formatter attempts to split lines at whitespace or word boundaries.
-If the bWorkWrap flag is set QRF_SW_Off, then the QRF makes not attempt
-to find good places to split lines and will usually split lines in the
-middle of words.
-
-### 2.9 Column width and alignment (nWidth and aWidth)
+QRF_STYLE_Markdown, or QRF_STYLE_Table), the formatter attempts to limit
+the width of any individual column to sqlite3_qrf_spec.mxColWidth characters
+if mxColWidth is non-zero. A zero value for mxColWidth means "unlimited".
+The formatter also attempts to limit the width of the entire table to
+no more than sqlite3_qrf_spec.mxTotalWidth characters. Again, a zero
+value means "no-limit".
+
+The mxColWidth limit might be exceeded if the limit is very small.
+The mxTotalWidth is "best effort"; the formatter might go significantly
+beyond the mxTotalWidth if the table has too many columns
+to squeeze into the specified space.
+
+In order to keep individual columns, or the entire table, within
+requested length limits, it is sometimes necessary to wrap the content
+for a single row of a single column across multiple lines. When this
+becomes necessary and if the bWordWrap setting is QRF_SW_On, then the
+formatter attempts to split the content on whitespace or at a word boundary.
+If bWordWrap is QRF_SW_Off, then the formatter is free to split content
+anywhere, including in the middle of a word.
+
+For narrow columns and wide words, it might sometimes be necessary to split
+a column in the middle of a word, even when bWordWrap is QRF_SW_On.
+
+### 2.10 Column width and alignment (nWidth and aWidth)
The sqlite3_qrf_spec.aWidth field is a pointer to an array of
signed 16-bit integers that control column widths and alignments
right-justified columns and positive values are used for left-justified
columns.
-### 2.10 Row and Column Separator Strings
+### 2.11 Row and Column Separator Strings
The sqlite3_qrf_spec.zColumnSep and sqlite3_qrf_spec.zRowSep strings
are alternative column and row separator character sequences. If not
are used. Some output styles have hard-coded column and row separators
and these settings are ignored for those styles.
-### 2.11 The Output Table Name
+### 2.12 The Output Table Name
The sqlite3_qrf_spec.zTableName value is the name of the output table
when eStyle is QRF_STYLE_Insert.
-### 2.12 The Rendering Of NULL
+### 2.13 The Rendering Of NULL
If a value is NULL then show the NULL using the string
found in sqlite3_qrf_spec.zNull. If zNull is itself a NULL pointer
then NULL values are rendered as an empty string.
-### 2.13 Optional Value Rendering Callback
+### 2.14 Optional Value Rendering Callback
If the sqlite3_qrf_spec.xRender field is not NULL, then each
sqlite3_value coming out of the query is first passed to the
return 0;
}
if( mxWidth<0 ) mxWidth = -mxWidth;
- if( mxWidth==0 ) mxWidth = 1000000;
+ if( mxWidth==0 ) mxWidth = QRF_MX_WIDTH;
i = j = n = 0;
while( n<=mxWidth ){
unsigned char c = z[i];
const unsigned char *zNotUsed;
int wx = p->actualWidth[i];
if( wx==0 ){
- wx = p->spec.mxWidth;
+ wx = p->spec.mxColWidth;
}
if( wx<0 ) wx = -wx;
uz = (const unsigned char*)sqlite3_column_name(p->pStmt,i);
for(i=0; i<nColumn; i++){
int wx = i<p->spec.nWidth ? p->spec.aWidth[i] : 0;
if( wx==0 || wx==QRF_MINUS_ZERO ){
- wx = p->spec.mxWidth;
+ wx = p->spec.mxColWidth;
}
if( wx<0 ) wx = -wx;
if( useNextLine ){
unsigned char bColumnNames; /* True to show column names */
unsigned char bWordWrap; /* Try to wrap on word boundaries */
unsigned char bTextJsonb; /* Render JSONB blobs as JSON text */
- short int mxWidth; /* Maximum width of any column */
+ short int mxColWidth; /* Maximum width of any individual column */
+ short int mxTotalWidth; /* Maximum overall table width */
+ int mxLength; /* Maximum content to display per element */
int nWidth; /* Number of column width parameters */
short int *aWidth; /* Column widths */
const char *zColumnSep; /* Alternative column separator */
};
/*
-** Range of values for sqlite3_qrf_spec.aWidth[] entries:
+** Range of values for sqlite3_qrf_spec.aWidth[] entries and for
+** sqlite3_qrf_spec.mxColWidth and .mxTotalWidth
*/
#define QRF_MX_WIDTH (10000)
#define QRF_MN_WIDTH (-10000)
-C Fix\san\serror-message\stest\scase\sbroken\sby\sthe\sprevious\scheck-in.
-D 2025-11-07T12:15:25.909
+C Rename\s"mxWidth"\sto\s"mxColWidth".\s\sAdd\s"mxTotalWidth"\sand\s"mxLength"\nsettings\sand\shook\sthem\sup\sto\sthe\sTCL\sinterface,\sbut\sthose\ssettings\sare\nnot\syet\simplemented.
+D 2025-11-07T13:11:16.220
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 09e6e3a3ff40a99677de3c0bc6569bd5f4709b1844ac3d1c1452a456c5a62f1c
F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee
-F ext/qrf/README.md 251568600920db5f82524ec63fc07e2dfebf98697cbaa708271b4ac6055ffb58
-F ext/qrf/qrf.c 772c87f50d591d7fa6e82730856ce04ac4321c31169d5025eae8608df3adc9b9
-F ext/qrf/qrf.h 39ba5d895f123bcce155b40446ec6d2728055f1f8bf29fdf8221f1eb8835d56d
+F ext/qrf/README.md a8d288316000b17675400e8e141e5377a1e0bb0090d443421dbf062ef88e2bac
+F ext/qrf/qrf.c ca5394613a0e755f68db3622b33c4abae23aacd3c4c2544dcf355558220217c3
+F ext/qrf/qrf.h a02d156e54e05c5ef66012b66817beecd6e2c60327491d98eb11361e7c0a19e2
F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8
F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255
F ext/rbu/rbu10.test 7c22caa32c2ff26983ca8320779a31495a6555737684af7aba3daaf762ef3363
F src/sqliteLimit.h fe70bd8983e5d317a264f2ea97473b359faf3ebb0827877a76813f5cf0cdc364
F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
-F src/tclsqlite.c c180acb528411fcb468a2d5f925befdc53afe4c4f821bd7ca35d86826a6d4787
+F src/tclsqlite.c cb5e3f5de07367b5b83af046c4ee4abae6b12b61bcbcf0d5df5049c17e9131f8
F src/tclsqlite.h 614b3780a62522bc9f8f2b9fb22689e8009958e7aa77e572d0f3149050af348a
F src/test1.c f880ab766eeedf2c063662bd9538b923fd42c4341b7bfc2150a6d93ab8b9341c
F src/test2.c 62f0830958f9075692c29c6de51b495ae8969e1bef85f239ffcd9ba5fb44a5ff
F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb
F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
F test/pushdown.test 46a626ef1c0ca79b85296ff2e078b9da20a50e9b804b38f441590c3987580ddd
-F test/qrf01.test 802e45eb9b106ad915ea561fafb709d626c8cb1bfee8e372bbcfd182002ddb77
+F test/qrf01.test 193a3ad8101975d3e574f0855eb7285928a554420fc354916a199600234e3d62
F test/qrf02.test 39b4afdc000bedccdafc0aecf17638df67a67aaa2d2942865ae6abcc48ba0e92
F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca
F test/quick.test 1681febc928d686362d50057c642f77a02c62e57
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 7dfba841cfc515ac28401c4eb90ec24e04fd52cddaeae41be3cfa6967dac0eac
-R bcc8bcd428fc9db4943cd2c8ec4dbd87
+P fb040354901569915389c8c4c1530dfda8b724be7885adfde654e229d3e98eec
+R 07c0c21d8a92a6dbfbd7b3fed9158cb5
U drh
-Z fa3fc5dd07b68cd8fbb8a0b772680d8e
+Z f2a96b5e64232cb1c60df6a68367fba5
# Remove this line to create a well-formed Fossil manifest.
-fb040354901569915389c8c4c1530dfda8b724be7885adfde654e229d3e98eec
+3f327e8fbc295b43c79118f8f49f8d2e20c2f3ac96e3b7f996720dab858d8199
** -columnnames ("auto"|"off"|"on") Show column names?
** -wordwrap ("auto"|"off"|"on") Try to wrap at word boundry?
** -textjsonb ("auto"|"off"|"on") Auto-convert JSONB to text?
-** -maxwidth NUMBER Default column width
+** -maxcolwidth NUMBER Max width of any single column
+** -maxwidth NUMBER Max width of the entire table
+** -maxlength NUMBER Content truncated to this size
** -widths LIST-OF-NUMBERS Widths for individual columns
** -columnsep TEXT Column separator text
** -rowsep TEXT Row separator text
** -columnnames bColumnNames
** -wordwrap bWordWrap
** -textjsonb bTextJsonb
-** -maxwidth mxWidth
+** -maxcolwidth mxColWidth
+** -maxwidth mxTotalWidth
+** -maxlength mxLength
** -widths nWidth, aWidth
** -columnsep zColumnSep
** -rowsep zRowSep
if( rc ) goto format_failed;
qrf.bTextJsonb = v;
i++;
- }else if( strcmp(zArg,"-maxwidth")==0 ){
+ }else if( strcmp(zArg,"-maxcolwidth")==0 || strcmp(zArg,"-maxwidth")==0 ){
int v = 0;
rc = Tcl_GetIntFromObj(pDb->interp, objv[i+1], &v);
if( rc ) goto format_failed;
}else if( v>QRF_MX_WIDTH ){
v = QRF_MX_WIDTH;
}
- qrf.mxWidth = v;
+ if( zArg[4]=='c' ){
+ qrf.mxColWidth = v;
+ }else{
+ qrf.mxTotalWidth = v;
+ }
+ i++;
+ }else if( strcmp(zArg,"-maxlength")==0 ){
+ int v = 0;
+ rc = Tcl_GetIntFromObj(pDb->interp, objv[i+1], &v);
+ if( rc ) goto format_failed;
+ if( v<0 ) v = 0;
+ qrf.mxLength = v;
i++;
}else if( strcmp(zArg,"-widths")==0 ){
Tcl_Size n = 0;
└─────────────────┴─────────────────┴────┘
}
do_test 4.3 {
- set result "\n[db format -text off -textjsonb on -maxwidth 10 \
+ set result "\n[db format -text off -textjsonb on -maxcolwidth 10 \
{SELECT a AS json, b AS jsonb, c AS num FROM t1}]"
} {
┌─────────────┬─────────────┬─────┐