Hi

When I played with vertical cursor support I got badly displayed last
columns when border was not 2. Only when border is 2, then psql displays
last column with same width for each row.

I think so we can force column width alignment for any border styles today
(for alignment and wrapping styles) or as minimum this behave can be
optional.

I wrote a patch with pset option "final_spaces", but I don't see a reason
why we trim rows today.

Regards

Pavel
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 7789fc6177..4849086c0f 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -2641,6 +2641,15 @@ lo_import 152801
           </listitem>
           </varlistentry>
 
+          <varlistentry>
+          <term><literal>final_spaces</literal></term>
+          <listitem>
+          <para>
+          With value <literal>always</literal> last column will have same width.
+          </para>
+          </listitem>
+          </varlistentry>
+
           <varlistentry>
           <term><literal>footer</literal></term>
           <listitem>
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index b981ae81ff..a91bb6ef6e 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -1980,7 +1980,7 @@ exec_command_pset(PsqlScanState scan_state, bool active_branch)
 			int			i;
 			static const char *const my_list[] = {
 				"border", "columns", "csv_fieldsep", "expanded", "fieldsep",
-				"fieldsep_zero", "footer", "format", "linestyle", "null",
+				"fieldsep_zero", "final_spaces", "footer", "format", "linestyle", "null",
 				"numericlocale", "pager", "pager_min_lines",
 				"recordsep", "recordsep_zero",
 				"tableattr", "title", "tuples_only",
@@ -3746,6 +3746,19 @@ _unicode_linestyle2string(int linestyle)
 	return "unknown";
 }
 
+static const char *
+_final_spaces_style2string(int finalspaces)
+{
+	switch (finalspaces)
+	{
+		case FINAL_SPACES_AUTO:
+			return "auto";
+		case FINAL_SPACES_ALWAYS:
+			return "always";
+	}
+	return "unknown";
+}
+
 /*
  * do_pset
  *
@@ -3820,6 +3833,21 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
 		}
 	}
 
+	else if (strcmp(param, "final_spaces") == 0)
+	{
+		if (!value)
+			;
+		if (pg_strncasecmp("auto", value, vallen) == 0)
+			popt->topt.final_spaces = FINAL_SPACES_AUTO;
+		else if (pg_strncasecmp("always", value, vallen) == 0)
+			popt->topt.final_spaces = FINAL_SPACES_ALWAYS;
+		else
+		{
+			pg_log_error("\\pset: allowed final space styles are auto or always");
+			return false;
+		}
+	}
+
 	/* set table line style */
 	else if (strcmp(param, "linestyle") == 0)
 	{
@@ -4247,6 +4275,12 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
 			   _unicode_linestyle2string(popt->topt.unicode_header_linestyle));
 	}
 
+	else if (strcmp(param, "final_spaces") == 0)
+	{
+		printf(_("final spaces style is \"%s\".\n"),
+			   _final_spaces_style2string(popt->topt.final_spaces));
+	}
+
 	else
 	{
 		pg_log_error("\\pset: unknown option: %s", param);
@@ -4357,6 +4391,8 @@ pset_value_string(const char *param, struct printQueryOpt *popt)
 		return pstrdup(_unicode_linestyle2string(popt->topt.unicode_column_linestyle));
 	else if (strcmp(param, "unicode_header_linestyle") == 0)
 		return pstrdup(_unicode_linestyle2string(popt->topt.unicode_header_linestyle));
+	else if (strcmp(param, "final_spaces") == 0)
+		return pstrdup(_final_spaces_style2string(popt->topt.final_spaces));
 	else
 		return pstrdup("ERROR");
 }
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index bcc7404c55..3162f77d68 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3707,7 +3707,7 @@ psql_completion(const char *text, int start, int end)
 		COMPLETE_WITH_QUERY(Query_for_list_of_roles);
 	else if (TailMatchesCS("\\pset"))
 		COMPLETE_WITH_CS("border", "columns", "csv_fieldsep", "expanded",
-						 "fieldsep", "fieldsep_zero", "footer", "format",
+						 "fieldsep", "final_spaces", "fieldsep_zero", "footer", "format",
 						 "linestyle", "null", "numericlocale",
 						 "pager", "pager_min_lines",
 						 "recordsep", "recordsep_zero",
@@ -3717,6 +3717,8 @@ psql_completion(const char *text, int start, int end)
 						 "unicode_header_linestyle");
 	else if (TailMatchesCS("\\pset", MatchAny))
 	{
+		if (TailMatchesCS("final_spaces"))
+			COMPLETE_WITH_CS("auto", "always");
 		if (TailMatchesCS("format"))
 			COMPLETE_WITH_CS("aligned", "asciidoc", "csv", "html", "latex",
 							 "latex-longtable", "troff-ms", "unaligned",
diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c
index e41f42ea98..77b9da357d 100644
--- a/src/fe_utils/print.c
+++ b/src/fe_utils/print.c
@@ -586,6 +586,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
 	unsigned short opt_border = cont->opt->border;
 	const printTextFormat *format = get_line_style(cont->opt);
 	const printTextLineFormat *dformat = &format->lrule[PRINT_RULE_DATA];
+	final_spaces_style opt_final_spaces = cont->opt->final_spaces;
 
 	unsigned int col_count = 0,
 				cell_count = 0;
@@ -1005,8 +1006,14 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
 				struct lineptr *this_line = &col_lineptrs[j][curr_nl_line[j]];
 				int			bytes_to_output;
 				int			chars_to_output = width_wrap[j];
-				bool		finalspaces = (opt_border == 2 ||
-										   (col_count > 0 && j < col_count - 1));
+				bool		finalspaces;
+
+				if (opt_final_spaces == FINAL_SPACES_AUTO)
+					finalspaces = opt_border == 2 ||
+										   (col_count > 0 && j < col_count - 1);
+				else
+					/* FINAL_SPACES_ALWAYS */
+					finalspaces = true;
 
 				/* Print left-hand wrap or newline mark */
 				if (opt_border != 0)
@@ -1100,7 +1107,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
 					fputs(format->wrap_right, fout);
 				else if (wrap[j] == PRINT_LINE_WRAP_NEWLINE)
 					fputs(format->nl_right, fout);
-				else if (opt_border == 2 || (col_count > 0 && j < col_count - 1))
+				else if (finalspaces)
 					fputc(' ', fout);
 
 				/* Print column divider, if not the last column */
diff --git a/src/include/fe_utils/print.h b/src/include/fe_utils/print.h
index f138d963d3..40fe50c655 100644
--- a/src/include/fe_utils/print.h
+++ b/src/include/fe_utils/print.h
@@ -88,6 +88,12 @@ typedef enum unicode_linestyle
 	UNICODE_LINESTYLE_DOUBLE
 } unicode_linestyle;
 
+typedef enum final_spaces_style
+{
+	FINAL_SPACES_AUTO = 0,
+	FINAL_SPACES_ALWAYS
+} final_spaces_style;
+
 struct separator
 {
 	char	   *separator;
@@ -123,6 +129,8 @@ typedef struct printTableOpt
 	unicode_linestyle unicode_border_linestyle;
 	unicode_linestyle unicode_column_linestyle;
 	unicode_linestyle unicode_header_linestyle;
+	final_spaces_style final_spaces;	/* allows final spaces for last column
+									 * for other border styles than 2 */
 } printTableOpt;
 
 /*

Reply via email to