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

Relevant PG commit:
c7461fc25558832dd347a9c8150b0f1ed85e36e8
naisila/failure_pg15
naisila 2022-07-25 22:24:38 +03:00
parent e21e976d64
commit c41ed5946c
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,
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, ')');