Hello

I had to reduce allowed line style to single or double, because unicode
allows only combination single,double or single,thick

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access
privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
=c/postgres          +
           |          |          |             |             |
postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
=c/postgres          +
           |          |          |             |             |
postgres=CTc/postgres
(3 rows)

postgres=# \pset border 2
Border style (border) is 2.
postgres=# \pset linestyle unicode
Line style (linestyle) is unicode.
postgres=# \l
                                   List of databases
┌───────────┬──────────┬──────────┬─────────────┬─────────────┬───────────────────────┐
│   Name    │  Owner   │ Encoding │   Collate   │    Ctype    │   Access
privileges   │
├───────────┼──────────┼──────────┼─────────────┼─────────────┼───────────────────────┤
│ postgres  │ postgres │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8
│                       │
│ template0 │ postgres │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8 │
=c/postgres          ↵│
│           │          │          │             │             │
postgres=CTc/postgres │
│ template1 │ postgres │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8 │
=c/postgres          ↵│
│           │          │          │             │             │
postgres=CTc/postgres │
└───────────┴──────────┴──────────┴─────────────┴─────────────┴───────────────────────┘
(3 rows)

postgres=# \pset unicode_header_linestyle double
Unicode border linestyle is "double".
postgres=# \l
                                   List of databases
┌───────────┬──────────┬──────────┬─────────────┬─────────────┬───────────────────────┐
│   Name    │  Owner   │ Encoding │   Collate   │    Ctype    │   Access
privileges   │
╞═══════════╪══════════╪══════════╪═════════════╪═════════════╪═══════════════════════╡
│ postgres  │ postgres │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8
│                       │
│ template0 │ postgres │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8 │
=c/postgres          ↵│
│           │          │          │             │             │
postgres=CTc/postgres │
│ template1 │ postgres │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8 │
=c/postgres          ↵│
│           │          │          │             │             │
postgres=CTc/postgres │
└───────────┴──────────┴──────────┴─────────────┴─────────────┴───────────────────────┘
(3 rows)

postgres=#

Regards

Pavel



2014-03-07 19:24 GMT+01:00 Pavel Stehule <pavel.steh...@gmail.com>:

> Hello
>
> I am returning back to this topic. Last time I proposed styles:
>
>
> http://www.postgresql.org/message-id/cafj8prclgoktryjpbtoncpgyftrcz-zgfowdc1jqulb+ede...@mail.gmail.com
>
> http://postgres.cz/wiki/Pretty_borders_in_psql
>
> This experiment fails, but there are some interesting tips in discuss.
>
> So I propose little bit different proposal - choose one predefined style
> for any table lines elements. These styles are active only when "linestyle"
> is unicode.
>
> So possible line elements are:
>
> * border,
> * header_separator,
> * row_separator,
> * column_separator,
>
> Possible styles (for each element)
>
> * none,
>  * single,
> * double,
> * thick,
>
> It should to have enough variability to define all styles proposed early.
> I hope, so this proposal is secure and simple for usage. Styles should be
> persistently saved in .psqlrc file - and some examples can be in
> documentation.
>
> Usage:
>
> \pset linestyle_border double
> \pset linestyle_header_separator single
> \pset linestyle_row_separator single
> \pset linestyle_column_separator single
>
> \pset linestyle unicode
>
> ╔═══╤════════════╤═══════╗
> ║ a │     b      │   c   ║
> ╟───┼────────────┼───────╢
> ║ 1 │ 2012-05-24 │ Hello ║
> ╟───┼────────────┼───────╢
> ║ 2 │ 2012-05-25 │ Hello ║
> ║   │            │ World ║
> ╚═══╧════════════╧═══════╝
> (2 rows)
>
>
> Comments, ideas ?
>
> Regards
>
> Pavel
>
>
>
>
>
>
>
>
From ea7a046afbd6f517b37606f3e52bd2e401d1fad2 Mon Sep 17 00:00:00 2001
From: Pavel Stehule <pavel.steh...@gooddata.com>
Date: Tue, 11 Mar 2014 20:57:08 +0100
Subject: [PATCH] initial

---
 doc/src/sgml/ref/psql-ref.sgml |  36 ++++++++
 src/bin/psql/command.c         | 118 +++++++++++++++++++++++-
 src/bin/psql/print.c           | 199 ++++++++++++++++++++++++++++++++---------
 src/bin/psql/print.h           |  22 ++++-
 src/bin/psql/startup.c         |   5 ++
 src/bin/psql/tab-complete.c    |  13 ++-
 6 files changed, 345 insertions(+), 48 deletions(-)

diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 8813be8..3e7e748 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -2273,6 +2273,42 @@ lo_import 152801
           </para>
           </listitem>
           </varlistentry>
+
+          <varlistentry>
+          <term><literal>unicode_border_style</literal></term>
+          <listitem>
+          <para>
+          Sets the border line drawing style to one
+          of <literal>single</literal> or  <literal>double</literal>
+          This option only affects the <literal>unicode</>
+          linestyle
+          </para>
+          </listitem>
+          </varlistentry>
+
+          <varlistentry>
+          <term><literal>unicode_column_style</literal></term>
+          <listitem>
+          <para>
+          Sets the column line drawing style to one
+          of <literal>single</literal> or  <literal>double</literal>
+          This option only affects the <literal>unicode</>
+          linestyle
+          </para>
+          </listitem>
+          </varlistentry>
+
+          <varlistentry>
+          <term><literal>unicode_header_style</literal></term>
+          <listitem>
+          <para>
+          Sets the header line drawing style to one
+          of <literal>single</literal> or  <literal>double</literal>
+          This option only affects the <literal>unicode</>
+          linestyle
+          </para>
+          </listitem>
+          </varlistentry>
         </variablelist>
         </para>
 
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index fd64ba8..0adccba 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -1054,6 +1054,9 @@ exec_command(const char *cmd,
 				"footer", "format", "linestyle", "null",
 				"numericlocale", "pager", "recordsep",
 				"tableattr", "title", "tuples_only",
+				"unicode_border_linestyle",
+				"unicode_column_linestyle",
+				"unicode_header_linestyle",
 				NULL
 			};
 
@@ -2247,6 +2250,55 @@ _align2string(enum printFormat in)
 	return "unknown";
 }
 
+/*
+ * Parse entered unicode linestyle. Returns true, when entered string is
+ * known linestyle: single, double else returns false.
+ */
+static bool 
+set_unicode_line_style(const char *value, size_t vallen, unicode_linestyle *linestyle)
+{
+	if (pg_strncasecmp("single", value, vallen) == 0)
+		*linestyle = UNICODE_LINESTYLE_SINGLE;
+	else if (pg_strncasecmp("double", value, vallen) == 0)
+		*linestyle = UNICODE_LINESTYLE_DOUBLE;
+	else
+		return false;
+
+	return true;
+}
+
+static const char *
+_unicode_linestyle2string(int linestyle)
+{
+	switch (linestyle)
+	{
+		case UNICODE_LINESTYLE_SINGLE:
+			return "single";
+			break;
+		case UNICODE_LINESTYLE_DOUBLE:
+			return "double";
+			break;
+	}
+	return "unknown";
+}
+
+static const char *
+_linestyle2string(linestyle_type line_style)
+{
+	switch (line_style)
+	{
+		case LINESTYLE_ASCII:
+			return "ascii";
+			break;
+		case LINESTYLE_OLD_ASCII:
+			return "old-ascii";
+			break;
+		case LINESTYLE_UNICODE:
+			return "unicode";
+			break;
+	}
+	return "unknown";
+}
 
 bool
 do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
@@ -2291,11 +2343,11 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
 		if (!value)
 			;
 		else if (pg_strncasecmp("ascii", value, vallen) == 0)
-			popt->topt.line_style = &pg_asciiformat;
+			popt->topt.line_style = LINESTYLE_ASCII;
 		else if (pg_strncasecmp("old-ascii", value, vallen) == 0)
-			popt->topt.line_style = &pg_asciiformat_old;
+			popt->topt.line_style = LINESTYLE_OLD_ASCII;
 		else if (pg_strncasecmp("unicode", value, vallen) == 0)
-			popt->topt.line_style = &pg_utf8format;
+			popt->topt.line_style = LINESTYLE_UNICODE;
 		else
 		{
 			psql_error("\\pset: allowed line styles are ascii, old-ascii, unicode\n");
@@ -2304,6 +2356,45 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
 
 	}
 
+	/* set unicode border line style */
+	else if (strcmp(param, "unicode_border_linestyle") == 0)
+	{
+		if (!value)
+			;
+		else if (!set_unicode_line_style(value, vallen, &popt->topt.unicode_border_linestyle))
+		{
+			psql_error("\\pset: allowed unicode border linestyle are single, double\n");
+			return false;
+		}
+
+	}
+
+	/* set unicode column line style */
+	else if (strcmp(param, "unicode_column_linestyle") == 0)
+	{
+		if (!value)
+			;
+		else if (!set_unicode_line_style(value, vallen, &popt->topt.unicode_column_linestyle))
+		{
+			psql_error("\\pset: allowed unicode column linestyle are single, double\n");
+			return false;
+		}
+
+	}
+
+	/* set unicode header line style */
+	else if (strcmp(param, "unicode_header_linestyle") == 0)
+	{
+		if (!value)
+			;
+		else if (!set_unicode_line_style(value, vallen, &popt->topt.unicode_header_linestyle))
+		{
+			psql_error("\\pset: allowed unicode header linestyle are single, double\n");
+			return false;
+		}
+
+	}
+
 	/* set border style/width */
 	else if (strcmp(param, "border") == 0)
 	{
@@ -2525,7 +2616,7 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
 	else if (strcmp(param, "linestyle") == 0)
 	{
 		printf(_("Line style (%s) is %s.\n"), param,
-			get_line_style(&popt->topt)->name);
+			_linestyle2string(popt->topt.line_style));
 	}
 
 	/* show null display */
@@ -2600,6 +2691,25 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
 			printf(_("Tuples only (%s) is off.\n"), param);
 	}
 
+	/* unicode style formatting */
+	else if (strcmp(param, "unicode_border_linestyle") == 0)
+	{
+		printf(_("Unicode border linestyle is \"%s\".\n"),
+				_unicode_linestyle2string(popt->topt.unicode_border_linestyle));
+	}
+
+	else if (strcmp(param, "unicode_column_linestyle") == 0)
+	{
+		printf(_("Unicode column linestyle is \"%s\".\n"),
+				_unicode_linestyle2string(popt->topt.unicode_column_linestyle));
+	}
+
+	else if (strcmp(param, "unicode_header_linestyle") == 0)
+	{
+		printf(_("Unicode border linestyle is \"%s\".\n"),
+				_unicode_linestyle2string(popt->topt.unicode_header_linestyle));
+	}
+
 	else
 	{
 		psql_error("\\pset: unknown option: %s\n", param);
diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c
index 79fc43e..a6f77c13 100644
--- a/src/bin/psql/print.c
+++ b/src/bin/psql/print.c
@@ -49,7 +49,6 @@ static printTableFooter default_footer_cell = {default_footer, NULL};
 /* Line style control structures */
 const printTextFormat pg_asciiformat =
 {
-	"ascii",
 	{
 		{"-", "+", "+", "+"},
 		{"-", "+", "+", "+"},
@@ -65,12 +64,12 @@ const printTextFormat pg_asciiformat =
 	"+",
 	".",
 	".",
-	true
+	true,
+	false
 };
 
 const printTextFormat pg_asciiformat_old =
 {
-	"old-ascii",
 	{
 		{"-", "+", "+", "+"},
 		{"-", "+", "+", "+"},
@@ -86,39 +85,85 @@ const printTextFormat pg_asciiformat_old =
 	" ",
 	" ",
 	" ",
+	false,
 	false
 };
 
-const printTextFormat pg_utf8format =
-{
-	"unicode",
-	{
-		/* ─, ┌, ┬, ┐ */
-		{"\342\224\200", "\342\224\214", "\342\224\254", "\342\224\220"},
-		/* ─, ├, ┼, ┤ */
-		{"\342\224\200", "\342\224\234", "\342\224\274", "\342\224\244"},
-		/* ─, └, ┴, ┘ */
-		{"\342\224\200", "\342\224\224", "\342\224\264", "\342\224\230"},
-		/* N/A, │, │, │ */
-		{"", "\342\224\202", "\342\224\202", "\342\224\202"}
+typedef struct unicodeStyleRowFormat {
+	const char *horizontal;
+	const char *vertical_and_right[2];
+	const char *vertical_and_left[2];
+} unicodeStyleRowFormat;
+
+typedef struct unicodeStyleColumnFormat {
+	const char *vertical;
+	const char *vertical_and_horizontal[2];
+	const char *up_and_horizontal[2];
+	const char *down_and_horizontal[2];
+} unicodeStyleColumnFormat;
+
+typedef struct unicodeStyleBorderFormat {
+	const char *up_and_right;
+	const char *vertical;
+	const char *down_and_right;
+	const char *horizontal;
+	const char *down_and_left;
+	const char *left_and_right;
+} unicodeStyleBorderFormat;
+
+typedef struct unicodeStyleFormat {
+	unicodeStyleRowFormat row_style[2];
+	unicodeStyleColumnFormat column_style[2];
+	unicodeStyleBorderFormat border_style[2];
+} unicodeStyleFormat;
+
+const unicodeStyleFormat unicode_style = {
+	{
+		{
+			/* ─ */
+			"\342\224\200",
+			/* ├╟ */
+			{"\342\224\234", "\342\225\237"},
+			/* ┤╢ */
+			{"\342\224\244", "\342\225\242"},
+		},
+		{
+			/* ═ */
+			"\342\225\220",
+			/* ╞╠ */
+			{"\342\225\236", "\342\225\240"},
+			/* ╡╣ */
+			{"\342\225\241", "\342\225\243"},
+		},
+	},
+	{
+		{
+			/* │ */
+			"\342\224\202",
+			/* ┼╪ */
+			{"\342\224\274", "\342\225\252"},
+			/* ┴╧ */
+			{"\342\224\264", "\342\225\247"},
+			/* ┬╤ */
+			{"\342\224\254", "\342\225\244"},
+		},
+		{
+			/* ║ */
+			"\342\225\221",
+			/* ╫╬ */
+			{"\342\225\253", "\342\225\254"},
+			/* ╨╩ */
+			{"\342\225\250", "\342\225\251"},
+			/* ╥╦ */
+			{"\342\225\245", "\342\225\246"},
+		},
+	},
+	{
+		/* └│┌─┐┘ */
+		{"\342\224\224", "\342\224\202", "\342\224\214", "\342\224\200", "\342\224\220", "\342\224\230"},
+		/* ╚║╔═╗╝ */
+		{"\342\225\232", "\342\225\221", "\342\225\224", "\342\225\220", "\342\225\227", "\342\225\235"},
 	},
-	/* │ */
-	"\342\224\202",
-	/* │ */
-	"\342\224\202",
-	/* │ */
-	"\342\224\202",
-	" ",
-	/* ↵ */
-	"\342\206\265",
-	" ",
-	/* ↵ */
-	"\342\206\265",
-	/* … */
-	"\342\200\246",
-	/* … */
-	"\342\200\246",
-	true
 };
 
 
@@ -128,6 +173,7 @@ static void IsPagerNeeded(const printTableContent *cont, const int extra_lines,
 			  FILE **fout, bool *is_pager);
 
 static void print_aligned_vertical(const printTableContent *cont, FILE *fout);
+static printTextFormat * prepare_unicode_format(const printTableOpt *opt);
 
 
 static int
@@ -503,7 +549,7 @@ print_aligned_text(const printTableContent *cont, FILE *fout)
 	bool		opt_tuples_only = cont->opt->tuples_only;
 	int			encoding = cont->opt->encoding;
 	unsigned short opt_border = cont->opt->border;
-	const printTextFormat *format = get_line_style(cont->opt);
+	printTextFormat *format = get_line_style(cont->opt);
 	const printTextLineFormat *dformat = &format->lrule[PRINT_RULE_DATA];
 
 	unsigned int col_count = 0,
@@ -1081,6 +1127,9 @@ cleanup:
 
 	if (is_pager)
 		ClosePager(fout);
+
+	if (format->free_format)
+		free(format);
 }
 
 
@@ -1092,7 +1141,7 @@ print_aligned_vertical_line(const printTableContent *cont,
 							printTextRule pos,
 							FILE *fout)
 {
-	const printTextFormat *format = get_line_style(cont->opt);
+	printTextFormat *format = get_line_style(cont->opt);
 	const printTextLineFormat *lformat = &format->lrule[pos];
 	unsigned short opt_border = cont->opt->border;
 	unsigned int i;
@@ -1139,6 +1188,9 @@ print_aligned_vertical_line(const printTableContent *cont,
 	if (opt_border == 2)
 		fprintf(fout, "%s%s", lformat->hrule, lformat->rightvrule);
 	fputc('\n', fout);
+
+	if (format->free_format)
+		free(format);
 }
 
 static void
@@ -1146,7 +1198,7 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 {
 	bool		opt_tuples_only = cont->opt->tuples_only;
 	unsigned short opt_border = cont->opt->border;
-	const printTextFormat *format = get_line_style(cont->opt);
+	printTextFormat *format = get_line_style(cont->opt);
 	const printTextLineFormat *dformat = &format->lrule[PRINT_RULE_DATA];
 	int			encoding = cont->opt->encoding;
 	unsigned long record = cont->opt->prior_records + 1;
@@ -1342,6 +1394,9 @@ print_aligned_vertical(const printTableContent *cont, FILE *fout)
 
 	if (is_pager)
 		ClosePager(fout);
+
+	if (format->free_format)
+		free(format);
 }
 
 
@@ -2695,7 +2750,7 @@ setDecimalLocale(void)
 }
 
 /* get selected or default line style */
-const printTextFormat *
+printTextFormat *
 get_line_style(const printTableOpt *opt)
 {
 	/*
@@ -2703,10 +2758,74 @@ get_line_style(const printTableOpt *opt)
 	 * printTableOpt struct can be initialized to zeroes to get default
 	 * behavior.
 	 */
-	if (opt->line_style != NULL)
-		return opt->line_style;
-	else
-		return &pg_asciiformat;
+	switch (opt->line_style)
+	{
+		case LINESTYLE_ASCII:
+			return &pg_asciiformat;
+		case LINESTYLE_OLD_ASCII:
+			return &pg_asciiformat_old;
+		case LINESTYLE_UNICODE:
+			return prepare_unicode_format(opt);
+	}
+}
+
+static printTextFormat *
+prepare_unicode_format(const printTableOpt *opt)
+{
+	printTextFormat *popt;
+
+	unicodeStyleBorderFormat *border;
+	unicodeStyleRowFormat *header;
+	unicodeStyleColumnFormat *column;
+
+	border = &unicode_style.border_style[opt->unicode_border_linestyle];
+	header = &unicode_style.row_style[opt->unicode_header_linestyle];
+	column = &unicode_style.column_style[opt->unicode_column_linestyle];
+
+	popt = pg_malloc(sizeof(printTextFormat));
+
+	popt->lrule[PRINT_RULE_TOP].hrule = border->horizontal;
+	popt->lrule[PRINT_RULE_TOP].leftvrule = border->down_and_right;
+	popt->lrule[PRINT_RULE_TOP].midvrule = column->down_and_horizontal[opt->unicode_border_linestyle];;
+	popt->lrule[PRINT_RULE_TOP].rightvrule = border->down_and_left;
+
+	popt->lrule[PRINT_RULE_MIDDLE].hrule = header->horizontal;
+	popt->lrule[PRINT_RULE_MIDDLE].leftvrule = header->vertical_and_right[opt->unicode_border_linestyle];
+	popt->lrule[PRINT_RULE_MIDDLE].midvrule = column->vertical_and_horizontal[opt->unicode_header_linestyle];
+	popt->lrule[PRINT_RULE_MIDDLE].rightvrule = header->vertical_and_left[opt->unicode_border_linestyle];
+
+	popt->lrule[PRINT_RULE_BOTTOM].hrule = border->horizontal;
+	popt->lrule[PRINT_RULE_BOTTOM].leftvrule = border->up_and_right;
+	popt->lrule[PRINT_RULE_BOTTOM].midvrule = column->up_and_horizontal[opt->unicode_border_linestyle];
+	popt->lrule[PRINT_RULE_BOTTOM].rightvrule = border->left_and_right;
+
+	/* N/A */
+	popt->lrule[PRINT_RULE_DATA].hrule = "";
+	popt->lrule[PRINT_RULE_DATA].leftvrule = border->vertical;
+	popt->lrule[PRINT_RULE_DATA].midvrule = column->vertical;
+	popt->lrule[PRINT_RULE_DATA].rightvrule = border->vertical;
+
+	popt->midvrule_nl = column->vertical;
+	popt->midvrule_wrap = column->vertical;
+	popt->midvrule_blank = column->vertical;
+	popt->header_nl_left = " ";
+
+	/* ↵ */
+	popt->header_nl_right = "\342\206\265";
+
+	popt->nl_left = " ";
+
+	/* ↵ */
+	popt->nl_right = "\342\206\265";
+
+	/* … */
+	popt->wrap_left = "\342\200\246";
+	popt->wrap_right = "\342\200\246";
+
+	popt->wrap_right_border = true;
+	popt->free_format = true;
+
+	return popt;
 }
 
 /*
diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h
index 87b2856..7e1f2f7 100644
--- a/src/bin/psql/print.h
+++ b/src/bin/psql/print.h
@@ -53,7 +53,6 @@ typedef enum printTextLineWrap
 typedef struct printTextFormat
 {
 	/* A complete line style */
-	const char *name;			/* for display purposes */
 	printTextLineFormat lrule[4];		/* indexed by enum printTextRule */
 	const char *midvrule_nl;	/* vertical line for continue after newline */
 	const char *midvrule_wrap;	/* vertical line for wrapped data */
@@ -66,8 +65,22 @@ typedef struct printTextFormat
 	const char *wrap_right;		/* right mark for wrapped data */
 	bool		wrap_right_border;		/* use right-hand border for wrap
 										 * marks when border=0? */
+	bool	free_format;		/* true, when format should be released after usage */
 } printTextFormat;
 
+typedef enum unicode_linestyle
+{
+	UNICODE_LINESTYLE_SINGLE = 0,		/* to make sure someone initializes this */
+	UNICODE_LINESTYLE_DOUBLE = 1
+} unicode_linestyle;
+
+typedef enum linestyle_type
+{
+	LINESTYLE_ASCII = 0,
+	LINESTYLE_OLD_ASCII,
+	LINESTYLE_UNICODE
+} linestyle_type; 
+
 struct separator
 {
 	char	   *separator;
@@ -88,7 +101,7 @@ typedef struct printTableOpt
 	bool		stop_table;		/* print stop decoration, eg </table> */
 	bool		default_footer; /* allow "(xx rows)" default footer */
 	unsigned long prior_records;	/* start offset for record counters */
-	const printTextFormat *line_style;	/* line style (NULL for default) */
+	linestyle_type line_style;	/* line style */
 	struct separator fieldSep;	/* field separator for unaligned text mode */
 	struct separator recordSep; /* record separator for unaligned text mode */
 	bool		numericLocale;	/* locale-aware numeric units separator and
@@ -97,6 +110,9 @@ typedef struct printTableOpt
 	int			encoding;		/* character encoding */
 	int			env_columns;	/* $COLUMNS on psql start, 0 is unset */
 	int			columns;		/* target width for wrapped format */
+	unicode_linestyle	unicode_border_linestyle;
+	unicode_linestyle	unicode_column_linestyle;
+	unicode_linestyle	unicode_header_linestyle;
 } printTableOpt;
 
 /*
@@ -177,7 +193,7 @@ extern void printQuery(const PGresult *result, const printQueryOpt *opt,
 		   FILE *fout, FILE *flog);
 
 extern void setDecimalLocale(void);
-extern const printTextFormat *get_line_style(const printTableOpt *opt);
+extern printTextFormat *get_line_style(const printTableOpt *opt);
 
 #ifndef __CYGWIN__
 #define DEFAULT_PAGER "more"
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index d5f1c0d..960bc9c 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -128,6 +128,11 @@ main(int argc, char *argv[])
 	pset.popt.topt.start_table = true;
 	pset.popt.topt.stop_table = true;
 	pset.popt.topt.default_footer = true;
+
+	pset.popt.topt.unicode_border_linestyle = UNICODE_LINESTYLE_SINGLE;
+	pset.popt.topt.unicode_column_linestyle = UNICODE_LINESTYLE_SINGLE;
+	pset.popt.topt.unicode_header_linestyle = UNICODE_LINESTYLE_SINGLE;
+
 	/* We must get COLUMNS here before readline() sets it */
 	pset.popt.topt.env_columns = getenv("COLUMNS") ? atoi(getenv("COLUMNS")) : 0;
 
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 1d69b95..430a327 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3371,7 +3371,8 @@ psql_completion(char *text, int start, int end)
 		{"border", "columns", "expanded", "fieldsep", "fieldsep_zero",
 		 "footer", "format", "linestyle", "null", "numericlocale",
 		 "pager", "recordsep", "recordsep_zero", "tableattr", "title",
-		 "tuples_only", NULL};
+		 "tuples_only", "unicode_border_linestyle", "unicode_column_linestyle",
+		 "unicode_header_linestyle", NULL};
 
 		COMPLETE_WITH_LIST_CS(my_list);
 	}
@@ -3392,6 +3393,16 @@ psql_completion(char *text, int start, int end)
 
 			COMPLETE_WITH_LIST_CS(my_list);
 		}
+		else if (strcmp(prev_wd, "unicode_border_linestyle") == 0 ||
+				 strcmp(prev_wd, "unicode_column_linestyle") == 0 ||
+				 strcmp(prev_wd, "unicode_header_linestyle") == 0)
+		{
+			static const char *const my_list[] =
+			{"single", "double", NULL};
+
+			COMPLETE_WITH_LIST_CS(my_list);
+
+		}
 	}
 	else if (strcmp(prev_wd, "\\set") == 0)
 	{
-- 
1.8.5.3

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to