Re: Anonymous-record-types omission - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: Anonymous-record-types omission |
Date | |
Msg-id | 200208282116.g7SLGRp04057@candle.pha.pa.us Whole thread Raw |
In response to | Anonymous-record-types omission (Joe Conway <mail@joeconway.com>) |
List | pgsql-patches |
Your patch has been added to the PostgreSQL unapplied patches list at: http://candle.pha.pa.us/cgi-bin/pgpatches I will try to apply it within the next 48 hours. --------------------------------------------------------------------------- Joe Conway wrote: > Tom Lane found an omission in the committed anonymous type code. The > coldeflist in the FROM clause was not being dumped by ruleutils.c. The > attached patch fixes this. Example: > > -- before -- > > regression=# \d pg_settings > View "pg_catalog.pg_settings" > Column | Type | Modifiers > ---------+------+----------- > name | text | > setting | text | > View definition: SELECT a.name, a.setting FROM pg_show_all_settings() a; > Rules: pg_settings_u, > pg_settings_n > > -- and after -- > > test=# \d pg_settings > View "pg_catalog.pg_settings" > Column | Type | Modifiers > ---------+------+----------- > name | text | > setting | text | > View definition: SELECT a.name, a.setting FROM pg_show_all_settings() > a(name text, setting text); > Rules: pg_settings_u, > pg_settings_n > > > Also included is the related adjustment to expected/rules.out. If there > are no objections, please apply. > > Thanks, > > Joe > Index: src/backend/utils/adt/ruleutils.c > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/backend/utils/adt/ruleutils.c,v > retrieving revision 1.118 > diff -c -r1.118 ruleutils.c > *** src/backend/utils/adt/ruleutils.c 26 Aug 2002 17:53:58 -0000 1.118 > --- src/backend/utils/adt/ruleutils.c 28 Aug 2002 04:11:54 -0000 > *************** > *** 61,66 **** > --- 61,67 ---- > #include "parser/parse_expr.h" > #include "parser/parse_func.h" > #include "parser/parse_oper.h" > + #include "parser/parse_type.h" > #include "parser/parsetree.h" > #include "rewrite/rewriteManip.h" > #include "rewrite/rewriteSupport.h" > *************** > *** 157,162 **** > --- 158,164 ---- > static void get_from_clause(Query *query, deparse_context *context); > static void get_from_clause_item(Node *jtnode, Query *query, > deparse_context *context); > + static void get_from_clause_coldeflist(List *coldeflist, deparse_context *context); > static void get_opclass_name(Oid opclass, Oid actual_datatype, > StringInfo buf); > static bool tleIsArrayAssign(TargetEntry *tle); > *************** > *** 2720,2725 **** > --- 2722,2728 ---- > foreach(l, query->jointree->fromlist) > { > Node *jtnode = (Node *) lfirst(l); > + List *coldeflist = NIL; > > if (IsA(jtnode, RangeTblRef)) > { > *************** > *** 2732,2741 **** > --- 2735,2757 ---- > continue; > if (strcmp(rte->eref->aliasname, "*OLD*") == 0) > continue; > + > + /* > + * Check to see if we have a function returning a RECORD > + * pseudo-type. If so, we need grab the coldeflist here. > + */ > + if (rte->rtekind == RTE_FUNCTION && > + get_typtype(exprType(rte->funcexpr)) == 'p' && > + exprType(rte->funcexpr) == RECORDOID) > + coldeflist = rte->coldeflist; > } > > appendStringInfo(buf, sep); > get_from_clause_item(jtnode, query, context); > + > + if (coldeflist != NIL) > + get_from_clause_coldeflist(coldeflist, context); > + > sep = ", "; > } > } > *************** > *** 2885,2890 **** > --- 2901,2950 ---- > else > elog(ERROR, "get_from_clause_item: unexpected node type %d", > nodeTag(jtnode)); > + } > + > + /* > + * get_from_clause_coldeflist - reproduce FROM clause coldeflist > + * > + * The coldeflist is appended immediately (no space) to buf. > + * > + */ > + static void > + get_from_clause_coldeflist(List *coldeflist, deparse_context *context) > + { > + StringInfo buf = context->buf; > + char *attname; > + Oid atttypeid; > + text *atttypename_text; > + char *atttypename; > + List *col; > + int i = 0; > + > + appendStringInfoChar(buf, '('); > + > + foreach(col, coldeflist) > + { > + ColumnDef *n = lfirst(col); > + > + /* get the column alias */ > + attname = n->colname; > + > + /* get a nicely formated column data type name */ > + atttypeid = typenameTypeId(n->typename); > + atttypename_text = DatumGetTextP(DirectFunctionCall2(format_type, > + ObjectIdGetDatum(atttypeid), (Datum) NULL)); > + atttypename = DatumGetCString(DirectFunctionCall1(textout, > + PointerGetDatum(atttypename_text))); > + > + if (i > 0) > + appendStringInfo(buf, ", %s %s", attname, atttypename); > + else > + appendStringInfo(buf, "%s %s", attname, atttypename); > + > + i++; > + } > + > + appendStringInfoChar(buf, ')'); > } > > /* > Index: src/test/regress/expected/rules.out > =================================================================== > RCS file: /opt/src/cvs/pgsql-server/src/test/regress/expected/rules.out,v > retrieving revision 1.59 > diff -c -r1.59 rules.out > *** src/test/regress/expected/rules.out 27 Aug 2002 18:06:00 -0000 1.59 > --- src/test/regress/expected/rules.out 28 Aug 2002 04:23:25 -0000 > *************** > *** 1268,1276 **** > --------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, rampr WHERE (ih.thepath ## r.thepath); > 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")); > ! pg_locks | SELECT l.relation, l."database", l.backendpid, l."mode", l.isgranted FROM pg_lock_status()l; > 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_namespacen ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name); > ! pg_settings | SELECT a.name, a.setting FROM pg_show_all_settings() a; > 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_queryFROM 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)); > pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relnameAS 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_classi ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'r'::"char"); > pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) ASseq_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 JOINpg_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; > --- 1268,1276 ---- > --------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > iexit | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, rampr WHERE (ih.thepath ## r.thepath); > 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")); > ! 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); > 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_namespacen ON ((n.oid = c.relnamespace))) WHERE (r.rulename <> '_RETURN'::name); > ! pg_settings | SELECT a.name, a.setting FROM pg_show_all_settings() a(name text, setting text); > 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_queryFROM 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)); > pg_stat_all_indexes | SELECT c.oid AS relid, i.oid AS indexrelid, n.nspname AS schemaname, c.relname, i.relnameAS 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_classi ON ((i.oid = x.indexrelid))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'r'::"char"); > pg_stat_all_tables | SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, pg_stat_get_numscans(c.oid) ASseq_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 JOINpg_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; > > ---------------------------(end of broadcast)--------------------------- > TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
pgsql-patches by date: