Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8a24a55

Browse files
committed
Fix ruleutils to dump column definition lists for anonymous record types
defined in the FROM clause. From Joe Conway, with some tweaks.
1 parent64505ed commit8a24a55

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

‎src/backend/utils/adt/ruleutils.c

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*back to source text
44
*
55
* IDENTIFICATION
6-
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.118 2002/08/26 17:53:58 tgl Exp $
6+
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.119 2002/08/29 01:19:41 tgl Exp $
77
*
88
* This software is copyrighted by Jan Wieck - Hamburg.
99
*
@@ -61,6 +61,7 @@
6161
#include"parser/parse_expr.h"
6262
#include"parser/parse_func.h"
6363
#include"parser/parse_oper.h"
64+
#include"parser/parse_type.h"
6465
#include"parser/parsetree.h"
6566
#include"rewrite/rewriteManip.h"
6667
#include"rewrite/rewriteSupport.h"
@@ -157,6 +158,8 @@ static void get_sublink_expr(Node *node, deparse_context *context);
157158
staticvoidget_from_clause(Query*query,deparse_context*context);
158159
staticvoidget_from_clause_item(Node*jtnode,Query*query,
159160
deparse_context*context);
161+
staticvoidget_from_clause_coldeflist(List*coldeflist,
162+
deparse_context*context);
160163
staticvoidget_opclass_name(Oidopclass,Oidactual_datatype,
161164
StringInfobuf);
162165
staticbooltleIsArrayAssign(TargetEntry*tle);
@@ -2749,6 +2752,8 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
27492752
{
27502753
intvarno= ((RangeTblRef*)jtnode)->rtindex;
27512754
RangeTblEntry*rte=rt_fetch(varno,query->rtable);
2755+
List*coldeflist=NIL;
2756+
boolgavealias= false;
27522757

27532758
switch (rte->rtekind)
27542759
{
@@ -2767,6 +2772,8 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
27672772
caseRTE_FUNCTION:
27682773
/* Function RTE */
27692774
get_rule_expr(rte->funcexpr,context);
2775+
/* might need to emit column list for RECORD function */
2776+
coldeflist=rte->coldeflist;
27702777
break;
27712778
default:
27722779
elog(ERROR,"unexpected rte kind %d", (int)rte->rtekind);
@@ -2776,7 +2783,8 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
27762783
{
27772784
appendStringInfo(buf," %s",
27782785
quote_identifier(rte->alias->aliasname));
2779-
if (rte->alias->colnames!=NIL)
2786+
gavealias= true;
2787+
if (rte->alias->colnames!=NIL&&coldeflist==NIL)
27802788
{
27812789
List*col;
27822790

@@ -2802,6 +2810,13 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
28022810
*/
28032811
appendStringInfo(buf," %s",
28042812
quote_identifier(rte->eref->aliasname));
2813+
gavealias= true;
2814+
}
2815+
if (coldeflist!=NIL)
2816+
{
2817+
if (!gavealias)
2818+
appendStringInfo(buf," AS ");
2819+
get_from_clause_coldeflist(coldeflist,context);
28052820
}
28062821
}
28072822
elseif (IsA(jtnode,JoinExpr))
@@ -2887,6 +2902,43 @@ get_from_clause_item(Node *jtnode, Query *query, deparse_context *context)
28872902
nodeTag(jtnode));
28882903
}
28892904

2905+
/*
2906+
* get_from_clause_coldeflist - reproduce FROM clause coldeflist
2907+
*
2908+
* The coldeflist is appended immediately (no space) to buf. Caller is
2909+
* responsible for ensuring that an alias or AS is present before it.
2910+
*/
2911+
staticvoid
2912+
get_from_clause_coldeflist(List*coldeflist,deparse_context*context)
2913+
{
2914+
StringInfobuf=context->buf;
2915+
List*col;
2916+
inti=0;
2917+
2918+
appendStringInfoChar(buf,'(');
2919+
2920+
foreach(col,coldeflist)
2921+
{
2922+
ColumnDef*n=lfirst(col);
2923+
char*attname;
2924+
Oidatttypeid;
2925+
int32atttypmod;
2926+
2927+
attname=n->colname;
2928+
atttypeid=typenameTypeId(n->typename);
2929+
atttypmod=n->typename->typmod;
2930+
2931+
if (i>0)
2932+
appendStringInfo(buf,", ");
2933+
appendStringInfo(buf,"%s %s",
2934+
quote_identifier(attname),
2935+
format_type_with_typemod(atttypeid,atttypmod));
2936+
i++;
2937+
}
2938+
2939+
appendStringInfoChar(buf,')');
2940+
}
2941+
28902942
/*
28912943
* get_opclass_name- fetch name of an index operator class
28922944
*

‎src/test/regress/expected/rules.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,9 +1268,9 @@ SELECT viewname, definition FROM pg_views ORDER BY viewname;
12681268
--------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
12691269
iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE (ih.thepath ## r.thepath);
12701270
pg_indexes | SELECT n.nspname AS schemaname, c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(i.oid) AS indexdef FROM (((pg_index x JOIN pg_class c ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE ((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char"));
1271-
pg_locks | SELECT l.relation, l."database", l.backendpid, l."mode", l.isgranted FROM pg_lock_status() l;
1271+
pg_locks | SELECT l.relation, l."database", l.backendpid, l."mode", l.isgranted FROM pg_lock_status() l(relation oid, "database" oid, backendpid integer, "mode" text, isgranted boolean);
12721272
pg_rules | SELECT n.nspname AS schemaname, c.relname AS tablename, r.rulename, pg_get_ruledef(r.oid) AS definition FROM ((pg_rewrite r JOIN pg_class c ON ((c.oid = r.ev_class))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name);
1273-
pg_settings | SELECT a.name, a.setting FROM pg_show_all_settings() a;
1273+
pg_settings | SELECT a.name, a.setting FROM pg_show_all_settings() a(name text, setting text);
12741274
pg_stat_activity | SELECT d.oid AS datid, d.datname, pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_userid(s.backendid) AS usesysid, u.usename, pg_stat_get_backend_activity(s.backendid) AS current_query FROM pg_database d, (SELECT pg_stat_get_backend_idset() AS backendid) s, pg_shadow u WHERE ((pg_stat_get_backend_dbid(s.backendid) = d.oid) AND (pg_stat_get_backend_userid(s.backendid) = u.usesysid));
12751275
pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relname AS indexrelname, pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch FROM (((pg_class c JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'r'::"char");
12761276
pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) AS seq_scan, pg_stat_get_tuples_returned(c.oid) AS seq_tup_read, sum(pg_stat_get_numscans(i.indexrelid)) AS idx_scan, sum(pg_stat_get_tuples_fetched(i.indexrelid)) AS idx_tup_fetch, pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, pg_stat_get_tuples_deleted(c.oid) AS n_tup_del FROM ((pg_class c LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'r'::"char") GROUP BY c.oid, n.nspname, c.relname;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp