aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/ruleutils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/ruleutils.c')
-rw-r--r--src/backend/utils/adt/ruleutils.c129
1 files changed, 80 insertions, 49 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 915fb7a6689..5ffce68c6f4 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -365,6 +365,7 @@ static const char *get_simple_binary_op_name(OpExpr *expr);
static bool isSimpleNode(Node *node, Node *parentNode, int prettyFlags);
static void appendContextKeyword(deparse_context *context, const char *str,
int indentBefore, int indentAfter, int indentPlus);
+static void removeStringInfoSpaces(StringInfo str);
static void get_rule_expr(Node *node, deparse_context *context,
bool showimplicit);
static void get_oper_expr(OpExpr *expr, deparse_context *context);
@@ -4479,42 +4480,42 @@ get_target_list(List *targetList, deparse_context *context,
/* Consider line-wrapping if enabled */
if (PRETTY_INDENT(context) && context->wrapColumn >= 0)
{
- int leading_nl_pos = -1;
- char *trailing_nl;
- int pos;
+ int leading_nl_pos;
- /* Does the new field start with whitespace plus a new line? */
- for (pos = 0; pos < targetbuf.len; pos++)
+ /* Does the new field start with a new line? */
+ if (targetbuf.len > 0 && targetbuf.data[0] == '\n')
+ leading_nl_pos = 0;
+ else
+ leading_nl_pos = -1;
+
+ /* If so, we shouldn't add anything */
+ if (leading_nl_pos >= 0)
{
- if (targetbuf.data[pos] == '\n')
- {
- leading_nl_pos = pos;
- break;
- }
- if (targetbuf.data[pos] != ' ')
- break;
+ /* instead, remove any trailing spaces currently in buf */
+ removeStringInfoSpaces(buf);
}
-
- /* Locate the start of the current line in the output buffer */
- trailing_nl = strrchr(buf->data, '\n');
- if (trailing_nl == NULL)
- trailing_nl = buf->data;
else
- trailing_nl++;
+ {
+ char *trailing_nl;
- /*
- * If the field we're adding is the first in the list, or it
- * already has a leading newline, don't add anything. Otherwise,
- * add a newline, plus some indentation, if either the new field
- * would cause an overflow or the last field used more than one
- * line.
- */
- if (colno > 1 &&
- leading_nl_pos == -1 &&
- ((strlen(trailing_nl) + strlen(targetbuf.data) > context->wrapColumn) ||
- last_was_multiline))
- appendContextKeyword(context, "", -PRETTYINDENT_STD,
- PRETTYINDENT_STD, PRETTYINDENT_VAR);
+ /* Locate the start of the current line in the output buffer */
+ trailing_nl = strrchr(buf->data, '\n');
+ if (trailing_nl == NULL)
+ trailing_nl = buf->data;
+ else
+ trailing_nl++;
+
+ /*
+ * Add a newline, plus some indentation, if the new field is
+ * not the first and either the new field would cause an
+ * overflow or the last field used more than one line.
+ */
+ if (colno > 1 &&
+ ((strlen(trailing_nl) + targetbuf.len > context->wrapColumn) ||
+ last_was_multiline))
+ appendContextKeyword(context, "", -PRETTYINDENT_STD,
+ PRETTYINDENT_STD, PRETTYINDENT_VAR);
+ }
/* Remember this field's multiline status for next iteration */
last_was_multiline =
@@ -6236,24 +6237,43 @@ static void
appendContextKeyword(deparse_context *context, const char *str,
int indentBefore, int indentAfter, int indentPlus)
{
+ StringInfo buf = context->buf;
+
if (PRETTY_INDENT(context))
{
context->indentLevel += indentBefore;
- appendStringInfoChar(context->buf, '\n');
- appendStringInfoSpaces(context->buf,
+ /* remove any trailing spaces currently in the buffer ... */
+ removeStringInfoSpaces(buf);
+ /* ... then add a newline and some spaces */
+ appendStringInfoChar(buf, '\n');
+ appendStringInfoSpaces(buf,
Max(context->indentLevel, 0) + indentPlus);
- appendStringInfoString(context->buf, str);
+
+ appendStringInfoString(buf, str);
context->indentLevel += indentAfter;
if (context->indentLevel < 0)
context->indentLevel = 0;
}
else
- appendStringInfoString(context->buf, str);
+ appendStringInfoString(buf, str);
}
/*
+ * removeStringInfoSpaces - delete trailing spaces from a buffer.
+ *
+ * Possibly this should move to stringinfo.c at some point.
+ */
+static void
+removeStringInfoSpaces(StringInfo str)
+{
+ while (str->len > 0 && str->data[str->len - 1] == ' ')
+ str->data[--(str->len)] = '\0';
+}
+
+
+/*
* get_rule_expr_paren - deparse expr using get_rule_expr,
* embracing the string with parentheses if necessary for prettyPrint.
*
@@ -7942,22 +7962,33 @@ get_from_clause(Query *query, const char *prefix, deparse_context *context)
/* Consider line-wrapping if enabled */
if (PRETTY_INDENT(context) && context->wrapColumn >= 0)
{
- char *trailing_nl;
-
- /* Locate the start of the current line in the buffer */
- trailing_nl = strrchr(buf->data, '\n');
- if (trailing_nl == NULL)
- trailing_nl = buf->data;
+ /* Does the new item start with a new line? */
+ if (itembuf.len > 0 && itembuf.data[0] == '\n')
+ {
+ /* If so, we shouldn't add anything */
+ /* instead, remove any trailing spaces currently in buf */
+ removeStringInfoSpaces(buf);
+ }
else
- trailing_nl++;
+ {
+ char *trailing_nl;
- /*
- * Add a newline, plus some indentation, if the new item would
- * cause an overflow.
- */
- if (strlen(trailing_nl) + strlen(itembuf.data) > context->wrapColumn)
- appendContextKeyword(context, "", -PRETTYINDENT_STD,
- PRETTYINDENT_STD, PRETTYINDENT_VAR);
+ /* Locate the start of the current line in the buffer */
+ trailing_nl = strrchr(buf->data, '\n');
+ if (trailing_nl == NULL)
+ trailing_nl = buf->data;
+ else
+ trailing_nl++;
+
+ /*
+ * Add a newline, plus some indentation, if the new item
+ * would cause an overflow.
+ */
+ if (strlen(trailing_nl) + itembuf.len > context->wrapColumn)
+ appendContextKeyword(context, "", -PRETTYINDENT_STD,
+ PRETTYINDENT_STD,
+ PRETTYINDENT_VAR);
+ }
}
/* Add the new item */