From 6d6ca2166c3ae8db9fac2ec7fdadca0c4e6382a1 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 19 Apr 2002 23:13:54 +0000
Subject: [PATCH] Change naming rule for ON SELECT rules of views: they're all
 just _RETURN now, since there's no need to keep 'em unique anymore.

---
 doc/src/sgml/ref/create_rule.sgml    |  6 ++---
 doc/src/sgml/rules.sgml              |  8 +++----
 src/backend/commands/tablecmds.c     | 17 +-------------
 src/backend/commands/view.c          |  7 ++----
 src/backend/rewrite/rewriteDefine.c  | 30 +++++++++++++++---------
 src/backend/rewrite/rewriteSupport.c | 35 +---------------------------
 src/backend/utils/adt/ruleutils.c    |  7 ++----
 src/bin/initdb/initdb.sh             |  4 ++--
 src/bin/pg_dump/pg_dump.c            | 10 ++++----
 src/bin/psql/describe.c              | 10 ++++----
 src/include/catalog/catversion.h     |  4 ++--
 src/include/rewrite/rewriteSupport.h |  7 +++---
 src/test/regress/expected/rules.out  |  2 +-
 13 files changed, 50 insertions(+), 97 deletions(-)

diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml
index 1c5786a0c91..ae9571a7c58 100644
--- a/doc/src/sgml/ref/create_rule.sgml
+++ b/doc/src/sgml/ref/create_rule.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.34 2002/04/19 16:36:08 tgl Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_rule.sgml,v 1.35 2002/04/19 23:13:53 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -268,12 +268,12 @@ CREATE
     report an error because the query cycled too many times:
 
 <programlisting>
-CREATE RULE "_RETemp" AS
+CREATE RULE "_RETURN" AS
     ON SELECT TO emp
     DO INSTEAD 
 	SELECT * FROM toyemp;
 
-CREATE RULE "_RETtoyemp" AS
+CREATE RULE "_RETURN" AS
     ON SELECT TO toyemp
     DO INSTEAD 
 	SELECT * FROM emp;
diff --git a/doc/src/sgml/rules.sgml b/doc/src/sgml/rules.sgml
index 5385a900222..f26319c463a 100644
--- a/doc/src/sgml/rules.sgml
+++ b/doc/src/sgml/rules.sgml
@@ -1,4 +1,4 @@
-<!-- $Header: /cvsroot/pgsql/doc/src/sgml/rules.sgml,v 1.22 2002/03/22 19:20:26 petere Exp $ -->
+<!-- $Header: /cvsroot/pgsql/doc/src/sgml/rules.sgml,v 1.23 2002/04/19 23:13:53 tgl Exp $ -->
 
 <Chapter Id="rules">
 <Title>The Rule System</Title>
@@ -289,7 +289,7 @@ CREATE VIEW myview AS SELECT * FROM mytab;
 
 <ProgramListing>
 CREATE TABLE myview (<Replaceable>same attribute list as for mytab</Replaceable>);
-CREATE RULE "_RETmyview" AS ON SELECT TO myview DO INSTEAD
+CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
     SELECT * FROM mytab;
 </ProgramListing>
     
@@ -517,7 +517,7 @@ SELECT shoelace.sl_name, shoelace.sl_avail,
     range table and checks if there are rules in <Filename>pg_rewrite</Filename>
     for any relation. When processing the range table entry for
     <Filename>shoelace</Filename> (the only one up to now) it finds the
-    rule <literal>_RETshoelace</literal> with the parse tree
+    <literal>_RETURN</literal> rule with the parse tree
 
 <ProgramListing>
 <emphasis>SELECT s.sl_name, s.sl_avail,
@@ -1494,7 +1494,7 @@ UPDATE shoelace_data SET
     Again it's an INSTEAD rule and the previous parse tree is trashed.
     Note that this query still uses the view <Filename>shoelace</Filename>.
     But the rule system isn't finished with this loop so it continues
-    and applies the rule <literal>_RETshoelace</literal> on it and we get
+    and applies the <literal>_RETURN</literal> rule on it and we get
 
 <ProgramListing>
 UPDATE shoelace_data SET
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index b0b73af76e4..84e1ae40a5e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.4 2002/04/19 16:36:08 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.5 2002/04/19 23:13:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -40,8 +40,6 @@
 #include "parser/parse_expr.h"
 #include "parser/parse_relation.h"
 #include "parser/parse_type.h"
-#include "rewrite/rewriteDefine.h"
-#include "rewrite/rewriteSupport.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
 #include "utils/fmgroids.h"
@@ -2814,19 +2812,6 @@ renamerel(Oid relid, const char *newrelname)
 	if (relkind != RELKIND_INDEX)
 		TypeRename(oldrelname, namespaceId, newrelname);
 
-	/*
-	 * If it's a view, must also rename the associated ON SELECT rule.
-	 */
-	if (relkind == RELKIND_VIEW)
-	{
-		char	   *oldrulename,
-				   *newrulename;
-
-		oldrulename = MakeRetrieveViewRuleName(oldrelname);
-		newrulename = MakeRetrieveViewRuleName(newrelname);
-		RenameRewriteRule(relid, oldrulename, newrulename);
-	}
-
 	/*
 	 * Update rel name in any RI triggers associated with the relation.
 	 */
diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c
index bb4f2185b08..491c718a0ec 100644
--- a/src/backend/commands/view.c
+++ b/src/backend/commands/view.c
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	$Id: view.c,v 1.62 2002/04/15 05:22:03 tgl Exp $
+ *	$Id: view.c,v 1.63 2002/04/19 23:13:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -99,17 +99,14 @@ static RuleStmt *
 FormViewRetrieveRule(const RangeVar *view, Query *viewParse)
 {
 	RuleStmt   *rule;
-	char	   *rname;
 
 	/*
 	 * Create a RuleStmt that corresponds to the suitable rewrite rule
 	 * args for DefineQueryRewrite();
 	 */
-	rname = MakeRetrieveViewRuleName(view->relname);
-
 	rule = makeNode(RuleStmt);
 	rule->relation = copyObject((RangeVar *) view);
-	rule->rulename = pstrdup(rname);
+	rule->rulename = pstrdup(ViewSelectRuleName);
 	rule->whereClause = NULL;
 	rule->event = CMD_SELECT;
 	rule->instead = true;
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 8b40aeb4f73..922030c4bea 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.67 2002/04/18 20:01:09 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.68 2002/04/19 23:13:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -176,7 +176,6 @@ DefineQueryRewrite(RuleStmt *stmt)
 	{
 		List	   *tllist;
 		int			i;
-		char	   *expected_name;
 
 		/*
 		 * So there cannot be INSTEAD NOTHING, ...
@@ -265,15 +264,26 @@ DefineQueryRewrite(RuleStmt *stmt)
 		}
 
 		/*
-		 * ... and finally the rule must be named _RETviewname.
+		 * ... and finally the rule must be named _RETURN.
 		 */
-		expected_name = MakeRetrieveViewRuleName(event_obj->relname);
-		if (strcmp(expected_name, stmt->rulename) != 0)
+		if (strcmp(stmt->rulename, ViewSelectRuleName) != 0)
 		{
-			elog(ERROR, "view rule for \"%s\" must be named \"%s\"",
-				 event_obj->relname, expected_name);
+			/*
+			 * In versions before 7.3, the expected name was _RETviewname.
+			 * For backwards compatibility with old pg_dump output, accept
+			 * that and silently change it to _RETURN.  Since this is just
+			 * a quick backwards-compatibility hack, limit the number of
+			 * characters checked to a few less than NAMEDATALEN; this
+			 * saves having to worry about where a multibyte character might
+			 * have gotten truncated.
+			 */
+			if (strncmp(stmt->rulename, "_RET", 4) != 0 ||
+				strncmp(stmt->rulename + 4, event_obj->relname,
+						NAMEDATALEN - 4 - 4) != 0)
+				elog(ERROR, "view rule for \"%s\" must be named \"%s\"",
+					 event_obj->relname, ViewSelectRuleName);
+			stmt->rulename = pstrdup(ViewSelectRuleName);
 		}
-		pfree(expected_name);
 
 		/*
 		 * Are we converting a relation to a view?
@@ -418,9 +428,7 @@ setRuleCheckAsUser_walker(Node *node, Oid *context)
 /*
  * Rename an existing rewrite rule.
  *
- * There is not currently a user command to invoke this directly
- * (perhaps there should be).  But we need it anyway to rename the
- * ON SELECT rule associated with a view, when the view is renamed.
+ * This is unused code at the moment.
  */
 void
 RenameRewriteRule(Oid owningRel, const char *oldName,
diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c
index 62a951aaf6f..92ab521c1fb 100644
--- a/src/backend/rewrite/rewriteSupport.c
+++ b/src/backend/rewrite/rewriteSupport.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.50 2002/04/18 20:01:09 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.51 2002/04/19 23:13:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -20,10 +20,6 @@
 #include "rewrite/rewriteSupport.h"
 #include "utils/syscache.h"
 
-#ifdef MULTIBYTE
-#include "mb/pg_wchar.h"
-#endif
-
 
 /*
  * Is there a rule by the given name?
@@ -37,35 +33,6 @@ IsDefinedRewriteRule(Oid owningRel, const char *ruleName)
 								0, 0);
 }
 
-/*
- * makeViewRetrieveRuleName
- *
- * Given a view name, returns the name for the associated ON SELECT rule.
- *
- * XXX this is not the only place in the backend that knows about the _RET
- * name-forming convention.
- */
-char *
-MakeRetrieveViewRuleName(const char *viewName)
-{
-	char	   *buf;
-	int			buflen,
-				maxlen;
-
-	buflen = strlen(viewName) + 5;
-	buf = palloc(buflen);
-	snprintf(buf, buflen, "_RET%s", viewName);
-	/* clip to less than NAMEDATALEN bytes, if necessary */
-#ifdef MULTIBYTE
-	maxlen = pg_mbcliplen(buf, strlen(buf), NAMEDATALEN - 1);
-#else
-	maxlen = NAMEDATALEN - 1;
-#endif
-	if (maxlen < buflen)
-		buf[maxlen] = '\0';
-
-	return buf;
-}
 
 /*
  * SetRelationRuleStatus
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 5207488405b..b99c886d8d1 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3,7 +3,7 @@
  *				back to source text
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.97 2002/04/18 20:01:09 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.98 2002/04/19 23:13:54 tgl Exp $
  *
  *	  This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -283,7 +283,6 @@ pg_do_getviewdef(Oid viewoid)
 	StringInfoData buf;
 	int			len;
 	char	   *viewname;
-	char	   *name;
 
 	/*
 	 * Connect to SPI manager
@@ -313,9 +312,8 @@ pg_do_getviewdef(Oid viewoid)
 	 * Get the pg_rewrite tuple for the view's SELECT rule
 	 */
 	viewname = get_rel_name(viewoid);
-	name = MakeRetrieveViewRuleName(viewname);
 	args[0] = ObjectIdGetDatum(viewoid);
-	args[1] = PointerGetDatum(name);
+	args[1] = PointerGetDatum(ViewSelectRuleName);
 	nulls[0] = ' ';
 	nulls[1] = ' ';
 	spirc = SPI_execp(plan_getviewrule, args, nulls, 2);
@@ -338,7 +336,6 @@ pg_do_getviewdef(Oid viewoid)
 	VARATT_SIZEP(ruledef) = len;
 	memcpy(VARDATA(ruledef), buf.data, buf.len);
 	pfree(buf.data);
-	pfree(name);
 
 	/*
 	 * Disconnect from SPI manager
diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh
index efacbe6c31a..4074c9cf613 100644
--- a/src/bin/initdb/initdb.sh
+++ b/src/bin/initdb/initdb.sh
@@ -27,7 +27,7 @@
 # Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
 # Portions Copyright (c) 1994, Regents of the University of California
 #
-# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.149 2002/04/18 20:01:10 tgl Exp $
+# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.150 2002/04/19 23:13:54 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -695,7 +695,7 @@ CREATE VIEW pg_rules AS \
         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 !~ '^_RET';
+    WHERE R.rulename != '_RETURN';
 
 CREATE VIEW pg_views AS \
     SELECT \
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 2c5d14e5f86..64807c25a00 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -22,7 +22,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.249 2002/04/18 20:01:10 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.250 2002/04/19 23:13:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2291,10 +2291,8 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs, const char *tablename)
 								  "oid as view_oid"
 								  " from pg_rewrite where"
 								  " ev_class = '%s'::oid and"
-								  " rulename = ('_RET' || ",
+								  " rulename = '_RETURN';",
 								  tblinfo[i].oid);
-				formatStringLiteral(query, tblinfo[i].relname, CONV_ALL);
-				appendPQExpBuffer(query, ")::name;");
 			}
 
 			res2 = PQexec(g_conn, query->data);
@@ -5006,7 +5004,7 @@ dumpRules(Archive *fout, const char *tablename,
 			continue;
 
 		/*
-		 * Get all rules defined for this table
+		 * Get all rules defined for this table, except view select rules
 		 */
 		resetPQExpBuffer(query);
 
@@ -5036,7 +5034,7 @@ dumpRules(Archive *fout, const char *tablename,
 							  "FROM pg_rewrite, pg_class "
 							  "WHERE pg_class.oid = '%s'::oid "
 							  " AND pg_rewrite.ev_class = pg_class.oid "
-							  " AND pg_rewrite.rulename !~ '^_RET' "
+							  " AND pg_rewrite.rulename != '_RETURN' "
 							  "ORDER BY pg_rewrite.oid",
 							  tblinfo[t].oid);
 		}
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 5c00ba87814..92fb6ed3a9f 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.49 2002/04/11 20:00:08 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/describe.c,v 1.50 2002/04/19 23:13:54 tgl Exp $
  */
 #include "postgres_fe.h"
 #include "describe.h"
@@ -385,9 +385,9 @@ objectDescription(const char *object)
 	/* Rule description (ignore rules for views) */
 			 "UNION ALL\n"
 			 "  SELECT r.oid as oid, r.tableoid as tableoid,\n"
-	 "  CAST(r.rulename AS text) as name, CAST('%s' AS text) as object\n"
+			 "  CAST(r.rulename AS text) as name, CAST('%s' AS text) as object\n"
 			 "  FROM pg_rewrite r\n"
-			 "  WHERE r.rulename !~ '^_RET'\n"
+			 "  WHERE r.rulename != '_RETURN'\n"
 
 	/* Trigger description */
 			 "UNION ALL\n"
@@ -704,8 +704,8 @@ describeTableDetails(const char *name, bool desc)
 			sprintf(buf,
 					"SELECT r.rulename\n"
 					"FROM pg_rewrite r, pg_class c\n"
-					"WHERE c.relname='%s' AND c.oid = r.ev_class\n"
-					"AND r.rulename NOT LIKE '_RET%%'",
+					"WHERE c.relname = '%s' AND c.oid = r.ev_class\n"
+					"AND r.rulename != '_RETURN'",
 					name);
 			result = PSQLexec(buf);
 			if (!result)
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 73ecb7fc6bd..242c285cb6c 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -37,7 +37,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: catversion.h,v 1.119 2002/04/19 16:36:08 tgl Exp $
+ * $Id: catversion.h,v 1.120 2002/04/19 23:13:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -53,6 +53,6 @@
  */
 
 /*							yyyymmddN */
-#define CATALOG_VERSION_NO	200204182
+#define CATALOG_VERSION_NO	200204191
 
 #endif
diff --git a/src/include/rewrite/rewriteSupport.h b/src/include/rewrite/rewriteSupport.h
index 7453dd99582..7d8ffd2ada5 100644
--- a/src/include/rewrite/rewriteSupport.h
+++ b/src/include/rewrite/rewriteSupport.h
@@ -7,16 +7,17 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: rewriteSupport.h,v 1.21 2002/04/18 20:01:11 tgl Exp $
+ * $Id: rewriteSupport.h,v 1.22 2002/04/19 23:13:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef REWRITESUPPORT_H
 #define REWRITESUPPORT_H
 
-extern bool IsDefinedRewriteRule(Oid owningRel, const char *ruleName);
+/* The ON SELECT rule of a view is always named this: */
+#define ViewSelectRuleName	"_RETURN"
 
-extern char *MakeRetrieveViewRuleName(const char *view_name);
+extern bool IsDefinedRewriteRule(Oid owningRel, const char *ruleName);
 
 extern void SetRelationRuleStatus(Oid relationId, bool relHasRules,
 					  bool relIsBecomingView);
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 75578b76e04..0816fc83e7c 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -1268,7 +1268,7 @@ SELECT viewname, definition FROM pg_views ORDER BY viewname;
 --------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  iexit                    | SELECT ih.name, ih.thepath, interpt_pp(ih.thepath, r.thepath) AS exit FROM ihighway ih, ramp r WHERE (ih.thepath ## r.thepath);
  pg_indexes               | SELECT c.relname AS tablename, i.relname AS indexname, pg_get_indexdef(x.indexrelid) AS indexdef FROM pg_index x, pg_class c, pg_class i WHERE ((((c.relkind = 'r'::"char") AND (i.relkind = 'i'::"char")) AND (c.oid = x.indrelid)) AND (i.oid = x.indexrelid));
- 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 !~ '^_RET'::text);
+ 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);
  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));
  pg_stat_all_indexes      | SELECT c.oid AS relid, i.oid AS indexrelid, 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, pg_class i, pg_index x WHERE (((c.relkind = 'r'::"char") AND (x.indrelid = c.oid)) AND (x.indexrelid = i.oid));
  pg_stat_all_tables       | SELECT c.oid AS relid, 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))) WHERE (c.relkind = 'r'::"char") GROUP BY c.oid, c.relname;
-- 
GitLab