Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit458ef6b

Browse files
committed
Fix further concerns about psql wrapping in expanded mode having
collateral damage on other formats, by Sergey Muraviov.
1 parent48d5084 commit458ef6b

File tree

3 files changed

+1752
-429
lines changed

3 files changed

+1752
-429
lines changed

‎src/bin/psql/print.c

Lines changed: 148 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,9 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
11601160
dformatsize=0;
11611161
structlineptr*hlineptr,
11621162
*dlineptr;
1163-
boolis_pager= false;
1163+
boolis_pager= false,
1164+
hmultiline= false,
1165+
dmultiline= false;
11641166
intoutput_columns=0;/* Width of interactive console */
11651167

11661168
if (cancel_pressed)
@@ -1196,7 +1198,10 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
11961198
if (width>hwidth)
11971199
hwidth=width;
11981200
if (height>hheight)
1201+
{
11991202
hheight=height;
1203+
hmultiline= true;
1204+
}
12001205
if (fs>hformatsize)
12011206
hformatsize=fs;
12021207
}
@@ -1213,7 +1218,10 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
12131218
if (width>dwidth)
12141219
dwidth=width;
12151220
if (height>dheight)
1221+
{
12161222
dheight=height;
1223+
dmultiline= true;
1224+
}
12171225
if (fs>dformatsize)
12181226
dformatsize=fs;
12191227
}
@@ -1258,45 +1266,82 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
12581266
if (cont->opt->format==PRINT_WRAPPED)
12591267
{
12601268
/*
1261-
* Calculate the available width to wrap the columns to after
1262-
* subtracting the maximum header width and separators. At a minimum
1263-
* enough to print "[ RECORD N ]"
1269+
* Separators width
12641270
*/
12651271
unsignedintwidth,
1266-
swidth;
1272+
min_width,
1273+
swidth,
1274+
iwidth=0;
12671275

12681276
if (opt_border==0)
1269-
swidth=1;/* "header data" */
1277+
{
1278+
/*
1279+
* For border = 0, one space in the middle.
1280+
*/
1281+
swidth=1;
1282+
}
12701283
elseif (opt_border==1)
1271-
swidth=3;/* "header | data" */
1272-
else
1273-
swidth=7;/* "| header | data |" */
1274-
1275-
/* Wrap to maximum width */
1276-
width=dwidth+swidth+hwidth;
1277-
if ((output_columns>0)&& (width>output_columns))
12781284
{
1279-
dwidth=output_columns-hwidth-swidth;
1280-
width=output_columns;
1285+
/*
1286+
* For border = 1, one for the pipe (|) in the middle
1287+
* between the two spaces.
1288+
*/
1289+
swidth=3;
12811290
}
1291+
else
1292+
/*
1293+
* For border = 2, two more for the pipes (|) at the begging and
1294+
* at the end of the lines.
1295+
*/
1296+
swidth=7;
12821297

1283-
/* Wrap to minimum width */
1298+
if ((opt_border<2)&&
1299+
((hmultiline&&
1300+
(format==&pg_asciiformat_old))||
1301+
(dmultiline&&
1302+
(format!=&pg_asciiformat_old))))
1303+
iwidth++;/* for newline indicators */
1304+
1305+
min_width=hwidth+iwidth+swidth+3;
1306+
1307+
/*
1308+
* Record header width
1309+
*/
12841310
if (!opt_tuples_only)
12851311
{
1286-
intdelta=1+log10(cont->nrows)-width;
1287-
1312+
/*
1313+
* Record number
1314+
*/
1315+
unsignedintrwidth=1+log10(cont->nrows);
12881316
if (opt_border==0)
1289-
delta+=6;/* "* RECORD " */
1317+
rwidth+=9;/* "* RECORD " */
12901318
elseif (opt_border==1)
1291-
delta+=10;/* "-[ RECORD ]" */
1319+
rwidth+=12;/* "-[ RECORD ]" */
12921320
else
1293-
delta+=15;/* "+-[ RECORD ]-+" */
1321+
rwidth+=15;/* "+-[ RECORD ]-+" */
12941322

1295-
if (delta>0)
1296-
dwidth+=delta;
1323+
if (rwidth>min_width)
1324+
min_width=rwidth;
12971325
}
1298-
elseif (dwidth<3)
1299-
dwidth=3;
1326+
1327+
/* Wrap to minimum width */
1328+
width=hwidth+iwidth+swidth+dwidth;
1329+
if ((width<min_width)|| (output_columns<min_width))
1330+
width=min_width-hwidth-iwidth-swidth;
1331+
elseif (output_columns>0)
1332+
/*
1333+
* Wrap to maximum width
1334+
*/
1335+
width=output_columns-hwidth-iwidth-swidth;
1336+
1337+
if ((width<dwidth)|| (dheight>1))
1338+
{
1339+
dmultiline= true;
1340+
if ((opt_border==0)&&
1341+
(format!=&pg_asciiformat_old))
1342+
width--;/* for wrap indicators */
1343+
}
1344+
dwidth=width;
13001345
}
13011346

13021347
/* print records */
@@ -1321,11 +1366,17 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
13211366
/* Print record header (e.g. "[ RECORD N ]") above each record */
13221367
if (i %cont->ncolumns==0)
13231368
{
1369+
unsignedintlhwidth=hwidth;
1370+
if ((opt_border<2)&&
1371+
(hmultiline)&&
1372+
(format==&pg_asciiformat_old))
1373+
lhwidth++;/* for newline indicators */
1374+
13241375
if (!opt_tuples_only)
1325-
print_aligned_vertical_line(cont,record++,hwidth,dwidth,
1326-
pos,fout);
1376+
print_aligned_vertical_line(cont,record++,lhwidth,
1377+
dwidth,pos,fout);
13271378
elseif (i!=0|| !cont->opt->start_table||opt_border==2)
1328-
print_aligned_vertical_line(cont,0,hwidth,dwidth,
1379+
print_aligned_vertical_line(cont,0,lhwidth,dwidth,
13291380
pos,fout);
13301381
}
13311382

@@ -1354,35 +1405,62 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
13541405
/* Header (never wrapped so just need to deal with newlines) */
13551406
if (!hcomplete)
13561407
{
1357-
intswidth,
1358-
twidth=hwidth+1;
1359-
1360-
fputs(hline ?format->header_nl_left :" ",fout);
1361-
strlen_max_width(hlineptr[hline].ptr,&twidth,
1408+
intswidth=hwidth,
1409+
target_width=hwidth;
1410+
/*
1411+
* Left spacer or new line indicator
1412+
*/
1413+
if ((opt_border==2)||
1414+
(hmultiline&& (format==&pg_asciiformat_old)))
1415+
fputs(hline ?format->header_nl_left :" ",fout);
1416+
/*
1417+
* Header text
1418+
*/
1419+
strlen_max_width(hlineptr[hline].ptr,&target_width,
13621420
encoding);
13631421
fprintf(fout,"%-s",hlineptr[hline].ptr);
13641422

1365-
swidth=hwidth-twidth;
1366-
if (swidth>0)/* spacer */
1423+
/*
1424+
* Spacer
1425+
*/
1426+
swidth-=target_width;
1427+
if (swidth>0)
13671428
fprintf(fout,"%*s",swidth," ");
13681429

1430+
/*
1431+
* New line indicator or separator's space
1432+
*/
13691433
if (hlineptr[hline+1].ptr)
13701434
{
13711435
/* More lines after this one due to a newline */
1372-
fputs(format->header_nl_right,fout);
1436+
if ((opt_border>0)||
1437+
(hmultiline&& (format!=&pg_asciiformat_old)))
1438+
fputs(format->header_nl_right,fout);
13731439
hline++;
13741440
}
13751441
else
13761442
{
13771443
/* This was the last line of the header */
1378-
fputs(" ",fout);
1444+
if ((opt_border>0)||
1445+
(hmultiline&& (format!=&pg_asciiformat_old)))
1446+
fputs(" ",fout);
13791447
hcomplete=1;
13801448
}
13811449
}
13821450
else
13831451
{
1384-
/* Header exhausted but more data for column */
1385-
fprintf(fout,"%*s",hwidth+2,"");
1452+
unsignedintswidth=hwidth+opt_border;
1453+
if ((opt_border<2)&&
1454+
(hmultiline)&&
1455+
(format==&pg_asciiformat_old))
1456+
swidth++;
1457+
1458+
if ((opt_border==0)&&
1459+
(format!=&pg_asciiformat_old)&&
1460+
(hmultiline))
1461+
swidth++;
1462+
1463+
fprintf(fout,"%*s",swidth," ");
13861464
}
13871465

13881466
/* Separator */
@@ -1401,13 +1479,18 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
14011479
/* Data */
14021480
if (!dcomplete)
14031481
{
1404-
inttarget_width,
1482+
inttarget_width=dwidth,
14051483
bytes_to_output,
1406-
swidth;
1484+
swidth=dwidth;
14071485

1486+
/*
1487+
* Left spacer on wrap indicator
1488+
*/
14081489
fputs(!dcomplete&& !offset ?" " :format->wrap_left,fout);
14091490

1410-
target_width=dwidth;
1491+
/*
1492+
* Data text
1493+
*/
14111494
bytes_to_output=strlen_max_width(dlineptr[dline].ptr+offset,
14121495
&target_width,encoding);
14131496
fputnbytes(fout, (char*) (dlineptr[dline].ptr+offset),
@@ -1416,31 +1499,47 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
14161499
chars_to_output-=target_width;
14171500
offset+=bytes_to_output;
14181501

1419-
/* spacer */
1420-
swidth=dwidth-target_width;
1421-
if (swidth>0)
1422-
fprintf(fout,"%*s",swidth,"");
1502+
/* Spacer */
1503+
swidth-=target_width;
14231504

14241505
if (chars_to_output)
14251506
{
14261507
/* continuing a wrapped column */
1427-
fputs(format->wrap_right,fout);
1508+
if ((opt_border>1)||
1509+
(dmultiline&& (format!=&pg_asciiformat_old)))
1510+
{
1511+
if (swidth>0)
1512+
fprintf(fout,"%*s",swidth," ");
1513+
fputs(format->wrap_right,fout);
1514+
}
14281515
}
14291516
elseif (dlineptr[dline+1].ptr)
14301517
{
14311518
/* reached a newline in the column */
1432-
fputs(format->nl_right,fout);
1519+
if ((opt_border>1)||
1520+
(dmultiline&& (format!=&pg_asciiformat_old)))
1521+
{
1522+
if (swidth>0)
1523+
fprintf(fout,"%*s",swidth," ");
1524+
fputs(format->nl_right,fout);
1525+
}
14331526
dline++;
14341527
offset=0;
14351528
chars_to_output=dlineptr[dline].width;
14361529
}
14371530
else
14381531
{
14391532
/* reached the end of the cell */
1440-
fputs(" ",fout);
1533+
if (opt_border>1)
1534+
{
1535+
if (swidth>0)
1536+
fprintf(fout,"%*s",swidth," ");
1537+
fputs(" ",fout);
1538+
}
14411539
dcomplete=1;
14421540
}
14431541

1542+
/* Right border */
14441543
if (opt_border==2)
14451544
fputs(dformat->rightvrule,fout);
14461545

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp