Обсуждение: Anonymous-record-types omission

Поиск
Список
Период
Сортировка

Anonymous-record-types omission

От
Joe Conway
Дата:
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; 

Re: Anonymous-record-types omission

От
Bruce Momjian
Дата:
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

Re: Anonymous-record-types omission

От
Tom Lane
Дата:
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