From 684fe6df15305625586cfbd5e4d5a86dbd2a719a Mon Sep 17 00:00:00 2001 From: naisila Date: Mon, 25 Jul 2022 22:24:38 +0300 Subject: [PATCH] Show 'AS "?column?"' explicitly when it's important in ruleutils_15.c Relevant PG commit: c7461fc25558832dd347a9c8150b0f1ed85e36e8 --- .../distributed/deparser/ruleutils_15.c | 106 ++++++++++++------ 1 file changed, 69 insertions(+), 37 deletions(-) diff --git a/src/backend/distributed/deparser/ruleutils_15.c b/src/backend/distributed/deparser/ruleutils_15.c index b9d12a126..aa4fd7b94 100644 --- a/src/backend/distributed/deparser/ruleutils_15.c +++ b/src/backend/distributed/deparser/ruleutils_15.c @@ -352,30 +352,34 @@ static void push_ancestor_plan(deparse_namespace *dpns, ListCell *ancestor_cell, static void pop_ancestor_plan(deparse_namespace *dpns, deparse_namespace *save_dpns); 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_query_def_extended(Query *query, StringInfo buf, List *parentnamespace, Oid distrelid, int64 shardid, - TupleDesc resultDesc, int prettyFlags, int wrapColumn, + 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); @@ -476,7 +480,7 @@ static void get_json_table_columns(TableFunc *tf, JsonTableParent *node, void pg_get_query_def(Query *query, StringInfo buffer) { - get_query_def(query, buffer, NIL, NULL, 0, WRAP_COLUMN_DEFAULT, 0); + get_query_def(query, buffer, NIL, NULL, false, 0, WRAP_COLUMN_DEFAULT, 0); } /* @@ -1964,24 +1968,36 @@ void deparse_shard_query(Query *query, Oid distrelid, int64 shardid, StringInfo buffer) { - get_query_def_extended(query, buffer, NIL, distrelid, shardid, NULL, 0, - WRAP_COLUMN_DEFAULT, 0); + get_query_def_extended(query, buffer, NIL, distrelid, shardid, NULL, + false, + 0, WRAP_COLUMN_DEFAULT, 0); } /* ---------- * 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) { get_query_def_extended(query, buf, parentnamespace, InvalidOid, 0, resultDesc, + colNamesVisible, prettyFlags, wrapColumn, startIndent); } @@ -1998,6 +2014,7 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace, static void get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace, Oid distrelid, int64 shardid, TupleDesc resultDesc, + bool colNamesVisible, int prettyFlags, int wrapColumn, int startIndent) { deparse_context context; @@ -2049,19 +2066,19 @@ get_query_def_extended(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: @@ -2188,6 +2205,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)) @@ -2269,7 +2287,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; @@ -2293,13 +2311,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; } @@ -2467,7 +2486,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; @@ -2523,7 +2542,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); @@ -2595,11 +2614,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; @@ -2650,8 +2671,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?"; } /* @@ -2730,7 +2756,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; @@ -2756,6 +2782,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) @@ -2798,7 +2825,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); @@ -2842,7 +2869,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; @@ -3178,7 +3205,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; @@ -3290,6 +3318,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); } @@ -3389,7 +3418,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); } } @@ -3399,7 +3428,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; @@ -3469,7 +3499,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); } } @@ -3631,7 +3661,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; @@ -3696,7 +3727,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); } } @@ -7827,7 +7858,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); @@ -8339,6 +8370,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, ')');