@@ -372,26 +372,29 @@ static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
372
372
static void make_viewdef (StringInfo buf ,HeapTuple ruletup ,TupleDesc rulettc ,
373
373
int prettyFlags ,int wrapColumn );
374
374
static void get_query_def (Query * query ,StringInfo buf ,List * parentnamespace ,
375
- TupleDesc resultDesc ,
375
+ TupleDesc resultDesc ,bool colNamesVisible ,
376
376
int prettyFlags ,int wrapColumn ,int startIndent );
377
377
static void get_values_def (List * values_lists ,deparse_context * context );
378
378
static void get_with_clause (Query * query ,deparse_context * context );
379
379
static void get_select_query_def (Query * query ,deparse_context * context ,
380
- TupleDesc resultDesc );
381
- static void get_insert_query_def (Query * query ,deparse_context * context );
382
- static void get_update_query_def (Query * query ,deparse_context * context );
380
+ TupleDesc resultDesc ,bool colNamesVisible );
381
+ static void get_insert_query_def (Query * query ,deparse_context * context ,
382
+ bool colNamesVisible );
383
+ static void get_update_query_def (Query * query ,deparse_context * context ,
384
+ bool colNamesVisible );
383
385
static void get_update_query_targetlist_def (Query * query ,List * targetList ,
384
386
deparse_context * context ,
385
387
RangeTblEntry * rte );
386
- static void get_delete_query_def (Query * query ,deparse_context * context );
388
+ static void get_delete_query_def (Query * query ,deparse_context * context ,
389
+ bool colNamesVisible );
387
390
static void get_utility_query_def (Query * query ,deparse_context * context );
388
391
static void get_basic_select_query (Query * query ,deparse_context * context ,
389
- TupleDesc resultDesc );
392
+ TupleDesc resultDesc , bool colNamesVisible );
390
393
static void get_target_list (List * targetList ,deparse_context * context ,
391
- TupleDesc resultDesc );
394
+ TupleDesc resultDesc , bool colNamesVisible );
392
395
static void get_setop_query (Node * setOp ,Query * query ,
393
396
deparse_context * context ,
394
- TupleDesc resultDesc );
397
+ TupleDesc resultDesc , bool colNamesVisible );
395
398
static Node * get_rule_sortgroupclause (Index ref ,List * tlist ,
396
399
bool force_colno ,
397
400
deparse_context * context );
@@ -4960,7 +4963,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
4960
4963
foreach (action ,actions )
4961
4964
{
4962
4965
query = (Query * )lfirst (action );
4963
- get_query_def (query ,buf ,NIL ,viewResultDesc ,
4966
+ get_query_def (query ,buf ,NIL ,viewResultDesc , true,
4964
4967
prettyFlags ,WRAP_COLUMN_DEFAULT ,0 );
4965
4968
if (prettyFlags )
4966
4969
appendStringInfoString (buf ,";\n" );
@@ -4978,7 +4981,7 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
4978
4981
Query * query ;
4979
4982
4980
4983
query = (Query * )linitial (actions );
4981
- get_query_def (query ,buf ,NIL ,viewResultDesc ,
4984
+ get_query_def (query ,buf ,NIL ,viewResultDesc , true,
4982
4985
prettyFlags ,WRAP_COLUMN_DEFAULT ,0 );
4983
4986
appendStringInfoChar (buf ,';' );
4984
4987
}
@@ -5052,7 +5055,7 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
5052
5055
5053
5056
ev_relation = table_open (ev_class ,AccessShareLock );
5054
5057
5055
- get_query_def (query ,buf ,NIL ,RelationGetDescr (ev_relation ),
5058
+ get_query_def (query ,buf ,NIL ,RelationGetDescr (ev_relation ), true,
5056
5059
prettyFlags ,wrapColumn ,0 );
5057
5060
appendStringInfoChar (buf ,';' );
5058
5061
@@ -5063,13 +5066,23 @@ make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,
5063
5066
/* ----------
5064
5067
* get_query_def- Parse back one query parsetree
5065
5068
*
5066
- * If resultDesc is not NULL, then it is the output tuple descriptor for
5067
- * the view represented by a SELECT query.
5069
+ * query: parsetree to be displayed
5070
+ * buf: output text is appended to buf
5071
+ * parentnamespace: list (initially empty) of outer-level deparse_namespace's
5072
+ * resultDesc: if not NULL, the output tuple descriptor for the view
5073
+ *represented by a SELECT query. We use the column names from it
5074
+ *to label SELECT output columns, in preference to names in the query
5075
+ * colNamesVisible: true if the surrounding context cares about the output
5076
+ *column names at all (as, for example, an EXISTS() context does not);
5077
+ *when false, we can suppress dummy column labels such as "?column?"
5078
+ * prettyFlags: bitmask of PRETTYFLAG_XXX options
5079
+ * wrapColumn: maximum line length, or -1 to disable wrapping
5080
+ * startIndent: initial indentation amount
5068
5081
* ----------
5069
5082
*/
5070
5083
static void
5071
5084
get_query_def (Query * query ,StringInfo buf ,List * parentnamespace ,
5072
- TupleDesc resultDesc ,
5085
+ TupleDesc resultDesc ,bool colNamesVisible ,
5073
5086
int prettyFlags ,int wrapColumn ,int startIndent )
5074
5087
{
5075
5088
deparse_context context ;
@@ -5106,19 +5119,19 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace,
5106
5119
switch (query -> commandType )
5107
5120
{
5108
5121
case CMD_SELECT :
5109
- get_select_query_def (query ,& context ,resultDesc );
5122
+ get_select_query_def (query ,& context ,resultDesc , colNamesVisible );
5110
5123
break ;
5111
5124
5112
5125
case CMD_UPDATE :
5113
- get_update_query_def (query ,& context );
5126
+ get_update_query_def (query ,& context , colNamesVisible );
5114
5127
break ;
5115
5128
5116
5129
case CMD_INSERT :
5117
- get_insert_query_def (query ,& context );
5130
+ get_insert_query_def (query ,& context , colNamesVisible );
5118
5131
break ;
5119
5132
5120
5133
case CMD_DELETE :
5121
- get_delete_query_def (query ,& context );
5134
+ get_delete_query_def (query ,& context , colNamesVisible );
5122
5135
break ;
5123
5136
5124
5137
case CMD_NOTHING :
@@ -5242,6 +5255,7 @@ get_with_clause(Query *query, deparse_context *context)
5242
5255
if (PRETTY_INDENT (context ))
5243
5256
appendContextKeyword (context ,"" ,0 ,0 ,0 );
5244
5257
get_query_def ((Query * )cte -> ctequery ,buf ,context -> namespaces ,NULL ,
5258
+ true,
5245
5259
context -> prettyFlags ,context -> wrapColumn ,
5246
5260
context -> indentLevel );
5247
5261
if (PRETTY_INDENT (context ))
@@ -5265,7 +5279,7 @@ get_with_clause(Query *query, deparse_context *context)
5265
5279
*/
5266
5280
static void
5267
5281
get_select_query_def (Query * query ,deparse_context * context ,
5268
- TupleDesc resultDesc )
5282
+ TupleDesc resultDesc , bool colNamesVisible )
5269
5283
{
5270
5284
StringInfo buf = context -> buf ;
5271
5285
List * save_windowclause ;
@@ -5289,13 +5303,14 @@ get_select_query_def(Query *query, deparse_context *context,
5289
5303
*/
5290
5304
if (query -> setOperations )
5291
5305
{
5292
- get_setop_query (query -> setOperations ,query ,context ,resultDesc );
5306
+ get_setop_query (query -> setOperations ,query ,context ,resultDesc ,
5307
+ colNamesVisible );
5293
5308
/* ORDER BY clauses must be simple in this case */
5294
5309
force_colno = true;
5295
5310
}
5296
5311
else
5297
5312
{
5298
- get_basic_select_query (query ,context ,resultDesc );
5313
+ get_basic_select_query (query ,context ,resultDesc , colNamesVisible );
5299
5314
force_colno = false;
5300
5315
}
5301
5316
@@ -5452,7 +5467,7 @@ get_simple_values_rte(Query *query, TupleDesc resultDesc)
5452
5467
5453
5468
static void
5454
5469
get_basic_select_query (Query * query ,deparse_context * context ,
5455
- TupleDesc resultDesc )
5470
+ TupleDesc resultDesc , bool colNamesVisible )
5456
5471
{
5457
5472
StringInfo buf = context -> buf ;
5458
5473
RangeTblEntry * values_rte ;
@@ -5505,7 +5520,7 @@ get_basic_select_query(Query *query, deparse_context *context,
5505
5520
}
5506
5521
5507
5522
/* Then we tell what to select (the targetlist) */
5508
- get_target_list (query -> targetList ,context ,resultDesc );
5523
+ get_target_list (query -> targetList ,context ,resultDesc , colNamesVisible );
5509
5524
5510
5525
/* Add the FROM clause if needed */
5511
5526
get_from_clause (query ," FROM " ,context );
@@ -5575,11 +5590,13 @@ get_basic_select_query(Query *query, deparse_context *context,
5575
5590
* get_target_list- Parse back a SELECT target list
5576
5591
*
5577
5592
* This is also used for RETURNING lists in INSERT/UPDATE/DELETE.
5593
+ *
5594
+ * resultDesc and colNamesVisible are as for get_query_def()
5578
5595
* ----------
5579
5596
*/
5580
5597
static void
5581
5598
get_target_list (List * targetList ,deparse_context * context ,
5582
- TupleDesc resultDesc )
5599
+ TupleDesc resultDesc , bool colNamesVisible )
5583
5600
{
5584
5601
StringInfo buf = context -> buf ;
5585
5602
StringInfoData targetbuf ;
@@ -5630,8 +5647,13 @@ get_target_list(List *targetList, deparse_context *context,
5630
5647
else
5631
5648
{
5632
5649
get_rule_expr ((Node * )tle -> expr ,context , true);
5633
- /* We'll show the AS name unless it's this: */
5634
- attname = "?column?" ;
5650
+
5651
+ /*
5652
+ * When colNamesVisible is true, we should always show the
5653
+ * assigned column name explicitly. Otherwise, show it only if
5654
+ * it's not FigureColname's fallback.
5655
+ */
5656
+ attname = colNamesVisible ?NULL :"?column?" ;
5635
5657
}
5636
5658
5637
5659
/*
@@ -5710,7 +5732,7 @@ get_target_list(List *targetList, deparse_context *context,
5710
5732
5711
5733
static void
5712
5734
get_setop_query (Node * setOp ,Query * query ,deparse_context * context ,
5713
- TupleDesc resultDesc )
5735
+ TupleDesc resultDesc , bool colNamesVisible )
5714
5736
{
5715
5737
StringInfo buf = context -> buf ;
5716
5738
bool need_paren ;
@@ -5736,6 +5758,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
5736
5758
if (need_paren )
5737
5759
appendStringInfoChar (buf ,'(' );
5738
5760
get_query_def (subquery ,buf ,context -> namespaces ,resultDesc ,
5761
+ colNamesVisible ,
5739
5762
context -> prettyFlags ,context -> wrapColumn ,
5740
5763
context -> indentLevel );
5741
5764
if (need_paren )
@@ -5778,7 +5801,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
5778
5801
else
5779
5802
subindent = 0 ;
5780
5803
5781
- get_setop_query (op -> larg ,query ,context ,resultDesc );
5804
+ get_setop_query (op -> larg ,query ,context ,resultDesc , colNamesVisible );
5782
5805
5783
5806
if (need_paren )
5784
5807
appendContextKeyword (context ,") " ,- subindent ,0 ,0 );
@@ -5822,7 +5845,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context,
5822
5845
subindent = 0 ;
5823
5846
appendContextKeyword (context ,"" ,subindent ,0 ,0 );
5824
5847
5825
- get_setop_query (op -> rarg ,query ,context ,resultDesc );
5848
+ get_setop_query (op -> rarg ,query ,context ,resultDesc , false );
5826
5849
5827
5850
if (PRETTY_INDENT (context ))
5828
5851
context -> indentLevel -= subindent ;
@@ -6157,7 +6180,8 @@ get_rule_windowspec(WindowClause *wc, List *targetList,
6157
6180
* ----------
6158
6181
*/
6159
6182
static void
6160
- get_insert_query_def (Query * query ,deparse_context * context )
6183
+ get_insert_query_def (Query * query ,deparse_context * context ,
6184
+ bool colNamesVisible )
6161
6185
{
6162
6186
StringInfo buf = context -> buf ;
6163
6187
RangeTblEntry * select_rte = NULL ;
@@ -6267,6 +6291,7 @@ get_insert_query_def(Query *query, deparse_context *context)
6267
6291
{
6268
6292
/* Add the SELECT */
6269
6293
get_query_def (select_rte -> subquery ,buf ,NIL ,NULL ,
6294
+ false,
6270
6295
context -> prettyFlags ,context -> wrapColumn ,
6271
6296
context -> indentLevel );
6272
6297
}
@@ -6360,7 +6385,7 @@ get_insert_query_def(Query *query, deparse_context *context)
6360
6385
{
6361
6386
appendContextKeyword (context ," RETURNING" ,
6362
6387
- PRETTYINDENT_STD ,PRETTYINDENT_STD ,1 );
6363
- get_target_list (query -> returningList ,context ,NULL );
6388
+ get_target_list (query -> returningList ,context ,NULL , colNamesVisible );
6364
6389
}
6365
6390
}
6366
6391
@@ -6370,7 +6395,8 @@ get_insert_query_def(Query *query, deparse_context *context)
6370
6395
* ----------
6371
6396
*/
6372
6397
static void
6373
- get_update_query_def (Query * query ,deparse_context * context )
6398
+ get_update_query_def (Query * query ,deparse_context * context ,
6399
+ bool colNamesVisible )
6374
6400
{
6375
6401
StringInfo buf = context -> buf ;
6376
6402
RangeTblEntry * rte ;
@@ -6415,7 +6441,7 @@ get_update_query_def(Query *query, deparse_context *context)
6415
6441
{
6416
6442
appendContextKeyword (context ," RETURNING" ,
6417
6443
- PRETTYINDENT_STD ,PRETTYINDENT_STD ,1 );
6418
- get_target_list (query -> returningList ,context ,NULL );
6444
+ get_target_list (query -> returningList ,context ,NULL , colNamesVisible );
6419
6445
}
6420
6446
}
6421
6447
@@ -6578,7 +6604,8 @@ get_update_query_targetlist_def(Query *query, List *targetList,
6578
6604
* ----------
6579
6605
*/
6580
6606
static void
6581
- get_delete_query_def (Query * query ,deparse_context * context )
6607
+ get_delete_query_def (Query * query ,deparse_context * context ,
6608
+ bool colNamesVisible )
6582
6609
{
6583
6610
StringInfo buf = context -> buf ;
6584
6611
RangeTblEntry * rte ;
@@ -6619,7 +6646,7 @@ get_delete_query_def(Query *query, deparse_context *context)
6619
6646
{
6620
6647
appendContextKeyword (context ," RETURNING" ,
6621
6648
- PRETTYINDENT_STD ,PRETTYINDENT_STD ,1 );
6622
- get_target_list (query -> returningList ,context ,NULL );
6649
+ get_target_list (query -> returningList ,context ,NULL , colNamesVisible );
6623
6650
}
6624
6651
}
6625
6652
@@ -9822,7 +9849,7 @@ get_sublink_expr(SubLink *sublink, deparse_context *context)
9822
9849
if (need_paren )
9823
9850
appendStringInfoChar (buf ,'(' );
9824
9851
9825
- get_query_def (query ,buf ,context -> namespaces ,NULL ,
9852
+ get_query_def (query ,buf ,context -> namespaces ,NULL , false,
9826
9853
context -> prettyFlags ,context -> wrapColumn ,
9827
9854
context -> indentLevel );
9828
9855
@@ -10068,6 +10095,7 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
10068
10095
/* Subquery RTE */
10069
10096
appendStringInfoChar (buf ,'(' );
10070
10097
get_query_def (rte -> subquery ,buf ,context -> namespaces ,NULL ,
10098
+ true,
10071
10099
context -> prettyFlags ,context -> wrapColumn ,
10072
10100
context -> indentLevel );
10073
10101
appendStringInfoChar (buf ,')' );