Обсуждение: Anonymous-record-types omission
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)
ASdefinition 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);
! 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.relname
ASindexrelname, 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) 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
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)
ASdefinition 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);
! 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.relname
ASindexrelname, 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) 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
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;
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
Joe Conway <mail@joeconway.com> writes:
> 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:
Applied with some tweaks --- it wasn't being careful about quoting,
and it did the wrong thing if there was no relation alias.
regards, tom lane