Show 'AS "?column?"' explicitly when it's important in ruleutils_15.c

Relevant PG commit:
c7461fc25558832dd347a9c8150b0f1ed85e36e8
pg15_onder_gpid
naisila 2022-07-25 22:24:38 +03:00
parent be59071e6a
commit d971ce9561
1 changed files with 69 additions and 37 deletions

View File

@ -352,30 +352,34 @@ static void push_ancestor_plan(deparse_namespace *dpns, ListCell *ancestor_cell,
static void pop_ancestor_plan(deparse_namespace *dpns, static void pop_ancestor_plan(deparse_namespace *dpns,
deparse_namespace *save_dpns); deparse_namespace *save_dpns);
static void get_query_def(Query *query, StringInfo buf, List *parentnamespace, static void get_query_def(Query *query, StringInfo buf, List *parentnamespace,
TupleDesc resultDesc, TupleDesc resultDesc, bool colNamesVisible,
int prettyFlags, int wrapColumn, int startIndent); int prettyFlags, int wrapColumn, int startIndent);
static void get_query_def_extended(Query *query, StringInfo buf, static void get_query_def_extended(Query *query, StringInfo buf,
List *parentnamespace, Oid distrelid, int64 shardid, List *parentnamespace, Oid distrelid, int64 shardid,
TupleDesc resultDesc, int prettyFlags, int wrapColumn, TupleDesc resultDesc, bool colNamesVisible,
int prettyFlags, int wrapColumn,
int startIndent); int startIndent);
static void get_values_def(List *values_lists, deparse_context *context); static void get_values_def(List *values_lists, deparse_context *context);
static void get_with_clause(Query *query, deparse_context *context); static void get_with_clause(Query *query, deparse_context *context);
static void get_select_query_def(Query *query, deparse_context *context, static void get_select_query_def(Query *query, deparse_context *context,
TupleDesc resultDesc); TupleDesc resultDesc, bool colNamesVisible);
static void get_insert_query_def(Query *query, deparse_context *context); static void get_insert_query_def(Query *query, deparse_context *context,
static void get_update_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, static void get_update_query_targetlist_def(Query *query, List *targetList,
deparse_context *context, deparse_context *context,
RangeTblEntry *rte); 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_utility_query_def(Query *query, deparse_context *context);
static void get_basic_select_query(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, 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, static void get_setop_query(Node *setOp, Query *query,
deparse_context *context, deparse_context *context,
TupleDesc resultDesc); TupleDesc resultDesc, bool colNamesVisible);
static Node *get_rule_sortgroupclause(Index ref, List *tlist, static Node *get_rule_sortgroupclause(Index ref, List *tlist,
bool force_colno, bool force_colno,
deparse_context *context); deparse_context *context);
@ -476,7 +480,7 @@ static void get_json_table_columns(TableFunc *tf, JsonTableParent *node,
void void
pg_get_query_def(Query *query, StringInfo buffer) 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, deparse_shard_query(Query *query, Oid distrelid, int64 shardid,
StringInfo buffer) StringInfo buffer)
{ {
get_query_def_extended(query, buffer, NIL, distrelid, shardid, NULL, 0, get_query_def_extended(query, buffer, NIL, distrelid, shardid, NULL,
WRAP_COLUMN_DEFAULT, 0); false,
0, WRAP_COLUMN_DEFAULT, 0);
} }
/* ---------- /* ----------
* get_query_def - Parse back one query parsetree * get_query_def - Parse back one query parsetree
* *
* If resultDesc is not NULL, then it is the output tuple descriptor for * query: parsetree to be displayed
* the view represented by a SELECT query. * 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 static void
get_query_def(Query *query, StringInfo buf, List *parentnamespace, get_query_def(Query *query, StringInfo buf, List *parentnamespace,
TupleDesc resultDesc, TupleDesc resultDesc, bool colNamesVisible,
int prettyFlags, int wrapColumn, int startIndent) int prettyFlags, int wrapColumn, int startIndent)
{ {
get_query_def_extended(query, buf, parentnamespace, InvalidOid, 0, resultDesc, get_query_def_extended(query, buf, parentnamespace, InvalidOid, 0, resultDesc,
colNamesVisible,
prettyFlags, wrapColumn, startIndent); prettyFlags, wrapColumn, startIndent);
} }
@ -1998,6 +2014,7 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace,
static void static void
get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace, get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace,
Oid distrelid, int64 shardid, TupleDesc resultDesc, Oid distrelid, int64 shardid, TupleDesc resultDesc,
bool colNamesVisible,
int prettyFlags, int wrapColumn, int startIndent) int prettyFlags, int wrapColumn, int startIndent)
{ {
deparse_context context; deparse_context context;
@ -2049,19 +2066,19 @@ get_query_def_extended(Query *query, StringInfo buf, List *parentnamespace,
switch (query->commandType) switch (query->commandType)
{ {
case CMD_SELECT: case CMD_SELECT:
get_select_query_def(query, &context, resultDesc); get_select_query_def(query, &context, resultDesc, colNamesVisible);
break; break;
case CMD_UPDATE: case CMD_UPDATE:
get_update_query_def(query, &context); get_update_query_def(query, &context, colNamesVisible);
break; break;
case CMD_INSERT: case CMD_INSERT:
get_insert_query_def(query, &context); get_insert_query_def(query, &context, colNamesVisible);
break; break;
case CMD_DELETE: case CMD_DELETE:
get_delete_query_def(query, &context); get_delete_query_def(query, &context, colNamesVisible);
break; break;
case CMD_NOTHING: case CMD_NOTHING:
@ -2188,6 +2205,7 @@ get_with_clause(Query *query, deparse_context *context)
if (PRETTY_INDENT(context)) if (PRETTY_INDENT(context))
appendContextKeyword(context, "", 0, 0, 0); appendContextKeyword(context, "", 0, 0, 0);
get_query_def((Query *) cte->ctequery, buf, context->namespaces, NULL, get_query_def((Query *) cte->ctequery, buf, context->namespaces, NULL,
true,
context->prettyFlags, context->wrapColumn, context->prettyFlags, context->wrapColumn,
context->indentLevel); context->indentLevel);
if (PRETTY_INDENT(context)) if (PRETTY_INDENT(context))
@ -2269,7 +2287,7 @@ get_with_clause(Query *query, deparse_context *context)
*/ */
static void static void
get_select_query_def(Query *query, deparse_context *context, get_select_query_def(Query *query, deparse_context *context,
TupleDesc resultDesc) TupleDesc resultDesc, bool colNamesVisible)
{ {
StringInfo buf = context->buf; StringInfo buf = context->buf;
List *save_windowclause; List *save_windowclause;
@ -2293,13 +2311,14 @@ get_select_query_def(Query *query, deparse_context *context,
*/ */
if (query->setOperations) 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 */ /* ORDER BY clauses must be simple in this case */
force_colno = true; force_colno = true;
} }
else else
{ {
get_basic_select_query(query, context, resultDesc); get_basic_select_query(query, context, resultDesc, colNamesVisible);
force_colno = false; force_colno = false;
} }
@ -2467,7 +2486,7 @@ get_simple_values_rte(Query *query, TupleDesc resultDesc)
static void static void
get_basic_select_query(Query *query, deparse_context *context, get_basic_select_query(Query *query, deparse_context *context,
TupleDesc resultDesc) TupleDesc resultDesc, bool colNamesVisible)
{ {
StringInfo buf = context->buf; StringInfo buf = context->buf;
RangeTblEntry *values_rte; RangeTblEntry *values_rte;
@ -2523,7 +2542,7 @@ get_basic_select_query(Query *query, deparse_context *context,
} }
/* Then we tell what to select (the targetlist) */ /* 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 */ /* Add the FROM clause if needed */
get_from_clause(query, " FROM ", context); 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 * get_target_list - Parse back a SELECT target list
* *
* This is also used for RETURNING lists in INSERT/UPDATE/DELETE. * This is also used for RETURNING lists in INSERT/UPDATE/DELETE.
*
* resultDesc and colNamesVisible are as for get_query_def()
* ---------- * ----------
*/ */
static void static void
get_target_list(List *targetList, deparse_context *context, get_target_list(List *targetList, deparse_context *context,
TupleDesc resultDesc) TupleDesc resultDesc, bool colNamesVisible)
{ {
StringInfo buf = context->buf; StringInfo buf = context->buf;
StringInfoData targetbuf; StringInfoData targetbuf;
@ -2650,8 +2671,13 @@ get_target_list(List *targetList, deparse_context *context,
else else
{ {
get_rule_expr((Node *) tle->expr, context, true); 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 static void
get_setop_query(Node *setOp, Query *query, deparse_context *context, get_setop_query(Node *setOp, Query *query, deparse_context *context,
TupleDesc resultDesc) TupleDesc resultDesc, bool colNamesVisible)
{ {
StringInfo buf = context->buf; StringInfo buf = context->buf;
bool need_paren; bool need_paren;
@ -2756,6 +2782,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
if (need_paren) if (need_paren)
appendStringInfoChar(buf, '('); appendStringInfoChar(buf, '(');
get_query_def(subquery, buf, context->namespaces, resultDesc, get_query_def(subquery, buf, context->namespaces, resultDesc,
colNamesVisible,
context->prettyFlags, context->wrapColumn, context->prettyFlags, context->wrapColumn,
context->indentLevel); context->indentLevel);
if (need_paren) if (need_paren)
@ -2798,7 +2825,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
else else
subindent = 0; subindent = 0;
get_setop_query(op->larg, query, context, resultDesc); get_setop_query(op->larg, query, context, resultDesc, colNamesVisible);
if (need_paren) if (need_paren)
appendContextKeyword(context, ") ", -subindent, 0, 0); appendContextKeyword(context, ") ", -subindent, 0, 0);
@ -2842,7 +2869,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
subindent = 0; subindent = 0;
appendContextKeyword(context, "", subindent, 0, 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)) if (PRETTY_INDENT(context))
context->indentLevel -= subindent; context->indentLevel -= subindent;
@ -3178,7 +3205,8 @@ get_rule_windowspec(WindowClause *wc, List *targetList,
* ---------- * ----------
*/ */
static void 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; StringInfo buf = context->buf;
RangeTblEntry *select_rte = NULL; RangeTblEntry *select_rte = NULL;
@ -3290,6 +3318,7 @@ get_insert_query_def(Query *query, deparse_context *context)
{ {
/* Add the SELECT */ /* Add the SELECT */
get_query_def(select_rte->subquery, buf, context->namespaces, NULL, get_query_def(select_rte->subquery, buf, context->namespaces, NULL,
false,
context->prettyFlags, context->wrapColumn, context->prettyFlags, context->wrapColumn,
context->indentLevel); context->indentLevel);
} }
@ -3389,7 +3418,7 @@ get_insert_query_def(Query *query, deparse_context *context)
{ {
appendContextKeyword(context, " RETURNING", appendContextKeyword(context, " RETURNING",
-PRETTYINDENT_STD, PRETTYINDENT_STD, 1); -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 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; StringInfo buf = context->buf;
RangeTblEntry *rte; RangeTblEntry *rte;
@ -3469,7 +3499,7 @@ get_update_query_def(Query *query, deparse_context *context)
{ {
appendContextKeyword(context, " RETURNING", appendContextKeyword(context, " RETURNING",
-PRETTYINDENT_STD, PRETTYINDENT_STD, 1); -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 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; StringInfo buf = context->buf;
RangeTblEntry *rte; RangeTblEntry *rte;
@ -3696,7 +3727,7 @@ get_delete_query_def(Query *query, deparse_context *context)
{ {
appendContextKeyword(context, " RETURNING", appendContextKeyword(context, " RETURNING",
-PRETTYINDENT_STD, PRETTYINDENT_STD, 1); -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) if (need_paren)
appendStringInfoChar(buf, '('); appendStringInfoChar(buf, '(');
get_query_def(query, buf, context->namespaces, NULL, get_query_def(query, buf, context->namespaces, NULL, false,
context->prettyFlags, context->wrapColumn, context->prettyFlags, context->wrapColumn,
context->indentLevel); context->indentLevel);
@ -8339,6 +8370,7 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
/* Subquery RTE */ /* Subquery RTE */
appendStringInfoChar(buf, '('); appendStringInfoChar(buf, '(');
get_query_def(rte->subquery, buf, context->namespaces, NULL, get_query_def(rte->subquery, buf, context->namespaces, NULL,
true,
context->prettyFlags, context->wrapColumn, context->prettyFlags, context->wrapColumn,
context->indentLevel); context->indentLevel);
appendStringInfoChar(buf, ')'); appendStringInfoChar(buf, ')');