aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/ruleutils.c107
-rw-r--r--src/test/regress/expected/matview.out4
2 files changed, 70 insertions, 41 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 49c4201dde6..c3937a60fd3 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -395,26 +395,29 @@ static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
int prettyFlags, int wrapColumn);
static void get_query_def(Query *query, StringInfo buf, List *parentnamespace,
- TupleDesc resultDesc,
+ TupleDesc resultDesc, bool colNamesVisible,
int prettyFlags, int wrapColumn, int startIndent);
static void get_values_def(List *values_lists, deparse_context *context);
static void get_with_clause(Query *query, deparse_context *context);
static void get_select_query_def(Query *query, deparse_context *context,
- TupleDesc resultDesc);
-static void get_insert_query_def(Query *query, deparse_context *context);
-static void get_update_query_def(Query *query, deparse_context *context);
+ TupleDesc resultDesc, bool colNamesVisible);
+static void get_insert_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible);
+static void get_update_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible);
static void get_update_query_targetlist_def(Query *query, List *targetList,
deparse_context *context,
RangeTblEntry *rte);
-static void get_delete_query_def(Query *query, deparse_context *context);
+static void get_delete_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible);
static void get_utility_query_def(Query *query, deparse_context *context);
static void get_basic_select_query(Query *query, deparse_context *context,
- TupleDesc resultDesc);
+ TupleDesc resultDesc, bool colNamesVisible);
static void get_target_list(List *targetList, deparse_context *context,
- TupleDesc resultDesc);
+ TupleDesc resultDesc, bool colNamesVisible);
static void get_setop_query(Node *setOp, Query *query,
deparse_context *context,
- TupleDesc resultDesc);
+ TupleDesc resultDesc, bool colNamesVisible);
static Node *get_rule_sortgroupclause(Index ref, List *tlist,
bool force_colno,
deparse_context *context);
@@ -1544,7 +1547,8 @@ pg_get_querydef(Query *query, bool pretty)
initStringInfo(&buf);
- get_query_def(query, &buf, NIL, NULL, prettyFlags, WRAP_COLUMN_DEFAULT, 0);
+ get_query_def(query, &buf, NIL, NULL, true,
+ prettyFlags, WRAP_COLUMN_DEFAULT, 0);
return buf.data;
}
@@ -3548,7 +3552,7 @@ print_function_sqlbody(StringInfo buf, HeapTuple proctup)
/* It seems advisable to get at least AccessShareLock on rels */
AcquireRewriteLocks(query, false, false);
- get_query_def(query, buf, list_make1(&dpns), NULL,
+ get_query_def(query, buf, list_make1(&dpns), NULL, false,
PRETTYFLAG_INDENT, WRAP_COLUMN_DEFAULT, 1);
appendStringInfoChar(buf, ';');
appendStringInfoChar(buf, '\n');
@@ -3562,7 +3566,7 @@ print_function_sqlbody(StringInfo buf, HeapTuple proctup)
/* It seems advisable to get at least AccessShareLock on rels */
AcquireRewriteLocks(query, false, false);
- get_query_def(query, buf, list_make1(&dpns), NULL,
+ get_query_def(query, buf, list_make1(&dpns), NULL, false,
0, WRAP_COLUMN_DEFAULT, 0);
}
}
@@ -5299,7 +5303,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
foreach(action, actions)
{
query = (Query *) lfirst(action);
- get_query_def(query, buf, NIL, viewResultDesc,
+ get_query_def(query, buf, NIL, viewResultDesc, true,
prettyFlags, WRAP_COLUMN_DEFAULT, 0);
if (prettyFlags)
appendStringInfoString(buf, ";\n");
@@ -5313,7 +5317,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
Query *query;
query = (Query *) linitial(actions);
- get_query_def(query, buf, NIL, viewResultDesc,
+ get_query_def(query, buf, NIL, viewResultDesc, true,
prettyFlags, WRAP_COLUMN_DEFAULT, 0);
appendStringInfoChar(buf, ';');
}
@@ -5387,7 +5391,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
ev_relation = table_open(ev_class, AccessShareLock);
- get_query_def(query, buf, NIL, RelationGetDescr(ev_relation),
+ get_query_def(query, buf, NIL, RelationGetDescr(ev_relation), true,
prettyFlags, wrapColumn, 0);
appendStringInfoChar(buf, ';');
@@ -5398,13 +5402,23 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
/* ----------
* get_query_def - Parse back one query parsetree
*
- * If resultDesc is not NULL, then it is the output tuple descriptor for
- * the view represented by a SELECT query.
+ * query: parsetree to be displayed
+ * buf: output text is appended to buf
+ * parentnamespace: list (initially empty) of outer-level deparse_namespace's
+ * resultDesc: if not NULL, the output tuple descriptor for the view
+ * represented by a SELECT query. We use the column names from it
+ * to label SELECT output columns, in preference to names in the query
+ * colNamesVisible: true if the surrounding context cares about the output
+ * column names at all (as, for example, an EXISTS() context does not);
+ * when false, we can suppress dummy column labels such as "?column?"
+ * prettyFlags: bitmask of PRETTYFLAG_XXX options
+ * wrapColumn: maximum line length, or -1 to disable wrapping
+ * startIndent: initial indentation amount
* ----------
*/
static void
get_query_def(Query *query, StringInfo buf, List *parentnamespace,
- TupleDesc resultDesc,
+ TupleDesc resultDesc, bool colNamesVisible,
int prettyFlags, int wrapColumn, int startIndent)
{
deparse_context context;
@@ -5442,19 +5456,19 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace,
switch (query->commandType)
{
case CMD_SELECT:
- get_select_query_def(query, &context, resultDesc);
+ get_select_query_def(query, &context, resultDesc, colNamesVisible);
break;
case CMD_UPDATE:
- get_update_query_def(query, &context);
+ get_update_query_def(query, &context, colNamesVisible);
break;
case CMD_INSERT:
- get_insert_query_def(query, &context);
+ get_insert_query_def(query, &context, colNamesVisible);
break;
case CMD_DELETE:
- get_delete_query_def(query, &context);
+ get_delete_query_def(query, &context, colNamesVisible);
break;
case CMD_NOTHING:
@@ -5578,6 +5592,7 @@ get_with_clause(Query *query, deparse_context *context)
if (PRETTY_INDENT(context))
appendContextKeyword(context, "", 0, 0, 0);
get_query_def((Query *) cte->ctequery, buf, context->namespaces, NULL,
+ true,
context->prettyFlags, context->wrapColumn,
context->indentLevel);
if (PRETTY_INDENT(context))
@@ -5659,7 +5674,7 @@ get_with_clause(Query *query, deparse_context *context)
*/
static void
get_select_query_def(Query *query, deparse_context *context,
- TupleDesc resultDesc)
+ TupleDesc resultDesc, bool colNamesVisible)
{
StringInfo buf = context->buf;
List *save_windowclause;
@@ -5683,13 +5698,14 @@ get_select_query_def(Query *query, deparse_context *context,
*/
if (query->setOperations)
{
- get_setop_query(query->setOperations, query, context, resultDesc);
+ get_setop_query(query->setOperations, query, context, resultDesc,
+ colNamesVisible);
/* ORDER BY clauses must be simple in this case */
force_colno = true;
}
else
{
- get_basic_select_query(query, context, resultDesc);
+ get_basic_select_query(query, context, resultDesc, colNamesVisible);
force_colno = false;
}
@@ -5859,7 +5875,7 @@ get_simple_values_rte(Query *query, TupleDesc resultDesc)
static void
get_basic_select_query(Query *query, deparse_context *context,
- TupleDesc resultDesc)
+ TupleDesc resultDesc, bool colNamesVisible)
{
StringInfo buf = context->buf;
RangeTblEntry *values_rte;
@@ -5915,7 +5931,7 @@ get_basic_select_query(Query *query, deparse_context *context,
}
/* Then we tell what to select (the targetlist) */
- get_target_list(query->targetList, context, resultDesc);
+ get_target_list(query->targetList, context, resultDesc, colNamesVisible);
/* Add the FROM clause if needed */
get_from_clause(query, " FROM ", context);
@@ -5987,11 +6003,13 @@ get_basic_select_query(Query *query, deparse_context *context,
* get_target_list - Parse back a SELECT target list
*
* This is also used for RETURNING lists in INSERT/UPDATE/DELETE.
+ *
+ * resultDesc and colNamesVisible are as for get_query_def()
* ----------
*/
static void
get_target_list(List *targetList, deparse_context *context,
- TupleDesc resultDesc)
+ TupleDesc resultDesc, bool colNamesVisible)
{
StringInfo buf = context->buf;
StringInfoData targetbuf;
@@ -6042,8 +6060,13 @@ get_target_list(List *targetList, deparse_context *context,
else
{
get_rule_expr((Node *) tle->expr, context, true);
- /* We'll show the AS name unless it's this: */
- attname = "?column?";
+
+ /*
+ * When colNamesVisible is true, we should always show the
+ * assigned column name explicitly. Otherwise, show it only if
+ * it's not FigureColname's fallback.
+ */
+ attname = colNamesVisible ? NULL : "?column?";
}
/*
@@ -6122,7 +6145,7 @@ get_target_list(List *targetList, deparse_context *context,
static void
get_setop_query(Node *setOp, Query *query, deparse_context *context,
- TupleDesc resultDesc)
+ TupleDesc resultDesc, bool colNamesVisible)
{
StringInfo buf = context->buf;
bool need_paren;
@@ -6148,6 +6171,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
if (need_paren)
appendStringInfoChar(buf, '(');
get_query_def(subquery, buf, context->namespaces, resultDesc,
+ colNamesVisible,
context->prettyFlags, context->wrapColumn,
context->indentLevel);
if (need_paren)
@@ -6190,7 +6214,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
else
subindent = 0;
- get_setop_query(op->larg, query, context, resultDesc);
+ get_setop_query(op->larg, query, context, resultDesc, colNamesVisible);
if (need_paren)
appendContextKeyword(context, ") ", -subindent, 0, 0);
@@ -6234,7 +6258,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
subindent = 0;
appendContextKeyword(context, "", subindent, 0, 0);
- get_setop_query(op->rarg, query, context, resultDesc);
+ get_setop_query(op->rarg, query, context, resultDesc, false);
if (PRETTY_INDENT(context))
context->indentLevel -= subindent;
@@ -6570,7 +6594,8 @@ get_rule_windowspec(WindowClause *wc, List *targetList,
* ----------
*/
static void
-get_insert_query_def(Query *query, deparse_context *context)
+get_insert_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible)
{
StringInfo buf = context->buf;
RangeTblEntry *select_rte = NULL;
@@ -6680,6 +6705,7 @@ get_insert_query_def(Query *query, deparse_context *context)
{
/* Add the SELECT */
get_query_def(select_rte->subquery, buf, context->namespaces, NULL,
+ false,
context->prettyFlags, context->wrapColumn,
context->indentLevel);
}
@@ -6773,7 +6799,7 @@ get_insert_query_def(Query *query, deparse_context *context)
{
appendContextKeyword(context, " RETURNING",
-PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
- get_target_list(query->returningList, context, NULL);
+ get_target_list(query->returningList, context, NULL, colNamesVisible);
}
}
@@ -6783,7 +6809,8 @@ get_insert_query_def(Query *query, deparse_context *context)
* ----------
*/
static void
-get_update_query_def(Query *query, deparse_context *context)
+get_update_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible)
{
StringInfo buf = context->buf;
RangeTblEntry *rte;
@@ -6828,7 +6855,7 @@ get_update_query_def(Query *query, deparse_context *context)
{
appendContextKeyword(context, " RETURNING",
-PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
- get_target_list(query->returningList, context, NULL);
+ get_target_list(query->returningList, context, NULL, colNamesVisible);
}
}
@@ -6990,7 +7017,8 @@ get_update_query_targetlist_def(Query *query, List *targetList,
* ----------
*/
static void
-get_delete_query_def(Query *query, deparse_context *context)
+get_delete_query_def(Query *query, deparse_context *context,
+ bool colNamesVisible)
{
StringInfo buf = context->buf;
RangeTblEntry *rte;
@@ -7031,7 +7059,7 @@ get_delete_query_def(Query *query, deparse_context *context)
{
appendContextKeyword(context, " RETURNING",
-PRETTYINDENT_STD, PRETTYINDENT_STD, 1);
- get_target_list(query->returningList, context, NULL);
+ get_target_list(query->returningList, context, NULL, colNamesVisible);
}
}
@@ -11039,7 +11067,7 @@ get_sublink_expr(SubLink *sublink, deparse_context *context)
if (need_paren)
appendStringInfoChar(buf, '(');
- get_query_def(query, buf, context->namespaces, NULL,
+ get_query_def(query, buf, context->namespaces, NULL, false,
context->prettyFlags, context->wrapColumn,
context->indentLevel);
@@ -11548,6 +11576,7 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
/* Subquery RTE */
appendStringInfoChar(buf, '(');
get_query_def(rte->subquery, buf, context->namespaces, NULL,
+ true,
context->prettyFlags, context->wrapColumn,
context->indentLevel);
appendStringInfoChar(buf, ')');
diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out
index 313c72a2685..c109d97635b 100644
--- a/src/test/regress/expected/matview.out
+++ b/src/test/regress/expected/matview.out
@@ -347,7 +347,7 @@ CREATE VIEW mvtest_vt2 AS SELECT moo, 2*moo FROM mvtest_vt1 UNION ALL SELECT moo
?column? | integer | | | | plain |
View definition:
SELECT mvtest_vt1.moo,
- 2 * mvtest_vt1.moo
+ 2 * mvtest_vt1.moo AS "?column?"
FROM mvtest_vt1
UNION ALL
SELECT mvtest_vt1.moo,
@@ -363,7 +363,7 @@ CREATE MATERIALIZED VIEW mv_test2 AS SELECT moo, 2*moo FROM mvtest_vt2 UNION ALL
?column? | integer | | | | plain | |
View definition:
SELECT mvtest_vt2.moo,
- 2 * mvtest_vt2.moo
+ 2 * mvtest_vt2.moo AS "?column?"
FROM mvtest_vt2
UNION ALL
SELECT mvtest_vt2.moo,