diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml index 1c5786a0c9168a0c1176c500a69ad28b4b731b19..ae9571a7c58659166c2852c92adf580c3f9754ae 100644 --- a/doc/src/sgml/ref/create_rule.sgml +++ b/doc/src/sgml/ref/create_rule.sgml @@ -1,5 +1,5 @@ @@ -268,12 +268,12 @@ CREATE report an error because the query cycled too many times: -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 5385a900222c88ab09cf4006f91743bc95e6b4e7..f26319c463a02d17c0d74a676f2ccc279b5ed644 100644 --- a/doc/src/sgml/rules.sgml +++ b/doc/src/sgml/rules.sgml @@ -1,4 +1,4 @@ - + The Rule System @@ -289,7 +289,7 @@ CREATE VIEW myview AS SELECT * FROM mytab; CREATE TABLE myview (same attribute list as for mytab); -CREATE RULE "_RETmyview" AS ON SELECT TO myview DO INSTEAD +CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD SELECT * FROM mytab; @@ -517,7 +517,7 @@ SELECT shoelace.sl_name, shoelace.sl_avail, range table and checks if there are rules in pg_rewrite for any relation. When processing the range table entry for shoelace (the only one up to now) it finds the - rule _RETshoelace with the parse tree + _RETURN rule with the parse tree 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 shoelace. But the rule system isn't finished with this loop so it continues - and applies the rule _RETshoelace on it and we get + and applies the _RETURN rule on it and we get UPDATE shoelace_data SET diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index b0b73af76e4424f45b053073669af62ae9ad816f..84e1ae40a5e218ade058335f5b306f997ce49e65 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 bb4f2185b08baac403fedd2e693812864714a18c..491c718a0ecb916ff7a767e5ed8a708fd113488c 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 8b40aeb4f735138a1003ff7318a2a8612f51eb70..922030c4beadab05099c6e0ac46f5bf148c3e9c1 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 62a951aaf6fc4d2b4b1269d633b786e857266a91..92ab521c1fbb932d2c832464c9d642522e3f7837 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 5207488405b57960766df91ef6abddc46011cddb..b99c886d8d10c426cf8aa2ef28ff21501fefd90e 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 efacbe6c31a637d74b363bec64a0e264cbe543ce..4074c9cf6138e3ccb9ab8a6824e3f3a4ac6f1674 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 2c5d14e5f86c661380b45766ea0a55cba00b7034..64807c25a00f77a5a2d15365bc89dc27d394ca0b 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 5c00ba878140e2317f7755e2540d0276ca392315..92fb6ed3a9f20880b3b3de98303c286b43d6a2ce 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 73ecb7fc6bdd3dd0af131971670196130df831af..242c285cb6c3a9fb57136fdfe8696f69e81f279c 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 7453dd995821b2fd67dd739936fcae6c752c3705..7d8ffd2ada58c84f2cb51057ba58aff53a2dfe7a 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 75578b76e0435088611db583bb87f5f79657179d..0816fc83e7ce34c82a688781752ad90de70790e5 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;