view-rule-fix.diff

text/plain

Filename: view-rule-fix.diff
Type: text/plain
Part: 0
Message: Re: [HACKERS] when does CREATE VIEW not create a view?

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
backend/commands/view.c 8 0
backend/rewrite/rewriteDefine.c 5 2
backend/utils/adt/ruleutils.c 16 19
bin/pg_dump/pg_dump.c 11 1
Index: backend/commands/view.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/view.c,v
retrieving revision 1.45
diff -c -r1.45 view.c
*** backend/commands/view.c	2000/07/04 06:11:30	1.45
--- backend/commands/view.c	2000/08/30 15:58:07
***************
*** 120,125 ****
--- 120,133 ----
  	buf = palloc(strlen(viewName) + 5);
  	snprintf(buf, strlen(viewName) + 5, "_RET%s", viewName);
  
+ #ifdef MULTIBYTE
+ 	int len;
+ 	len = pg_mbcliplen(buf,strlen(buf),NAMEDATALEN-1);
+ 	buf[len] = '\0';
+ #else
+ 	buf[NAMEDATALEN-1] = '\0';
+ #endif
+ 
  	return buf;
  }
  
Index: backend/rewrite/rewriteDefine.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v
retrieving revision 1.49
diff -c -r1.49 rewriteDefine.c
*** backend/rewrite/rewriteDefine.c	2000/07/30 22:13:51	1.49
--- backend/rewrite/rewriteDefine.c	2000/08/30 15:58:08
***************
*** 23,28 ****
--- 23,29 ----
  #include "parser/parse_relation.h"
  #include "rewrite/rewriteDefine.h"
  #include "rewrite/rewriteSupport.h"
+ #include "commands/view.h"
  
  
  /*
***************
*** 218,224 ****
  		Form_pg_attribute attr;
  		char	   *attname;
  		int			i;
! 		char		expected_name[NAMEDATALEN + 5];
  
  		/*
  		 * So there cannot be INSTEAD NOTHING, ...
--- 219,225 ----
  		Form_pg_attribute attr;
  		char	   *attname;
  		int			i;
! 		char		*expected_name;
  
  		/*
  		 * So there cannot be INSTEAD NOTHING, ...
***************
*** 305,316 ****
  		/*
  		 * ... and finally the rule must be named _RETviewname.
  		 */
! 		sprintf(expected_name, "_RET%s", event_obj->relname);
  		if (strcmp(expected_name, stmt->rulename) != 0)
  		{
  			elog(ERROR, "view rule for %s must be named %s",
  				 event_obj->relname, expected_name);
  		}
  	}
  
  	/*
--- 306,319 ----
  		/*
  		 * ... and finally the rule must be named _RETviewname.
  		 */
! 
! 		expected_name = MakeRetrieveViewRuleName(event_obj->relname);
  		if (strcmp(expected_name, stmt->rulename) != 0)
  		{
  			elog(ERROR, "view rule for %s must be named %s",
  				 event_obj->relname, expected_name);
  		}
+ 		pfree(expected_name);
  	}
  
  	/*
Index: backend/utils/adt/ruleutils.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v
retrieving revision 1.59
diff -c -r1.59 ruleutils.c
*** backend/utils/adt/ruleutils.c	2000/08/12 04:04:53	1.59
--- backend/utils/adt/ruleutils.c	2000/08/30 15:58:08
***************
*** 51,56 ****
--- 51,57 ----
  #include "parser/parse_expr.h"
  #include "parser/parsetree.h"
  #include "utils/lsyscache.h"
+ #include "commands/view.h"
  
  
  /* ----------
***************
*** 79,85 ****
  static void *plan_getrule = NULL;
  static char *query_getrule = "SELECT * FROM pg_rewrite WHERE rulename = $1";
  static void *plan_getview = NULL;
! static char *query_getview = "SELECT * FROM pg_rewrite WHERE rulename = $1 or rulename = $2";
  static void *plan_getam = NULL;
  static char *query_getam = "SELECT * FROM pg_am WHERE oid = $1";
  static void *plan_getopclass = NULL;
--- 80,86 ----
  static void *plan_getrule = NULL;
  static char *query_getrule = "SELECT * FROM pg_rewrite WHERE rulename = $1";
  static void *plan_getview = NULL;
! static char *query_getview = "SELECT * FROM pg_rewrite WHERE rulename = $1";
  static void *plan_getam = NULL;
  static char *query_getam = "SELECT * FROM pg_am WHERE oid = $1";
  static void *plan_getopclass = NULL;
***************
*** 138,144 ****
  	int			len;
  
  	/* ----------
! 	 * We need the rules name somewhere deep down
  	 * ----------
  	 */
  	rulename = pstrdup(NameStr(*rname));
--- 139,145 ----
  	int			len;
  
  	/* ----------
! 	 * We need the rules name somewhere deep down: rulename is global
  	 * ----------
  	 */
  	rulename = pstrdup(NameStr(*rname));
***************
*** 226,248 ****
  Datum
  pg_get_viewdef(PG_FUNCTION_ARGS)
  {
! 	Name		rname = PG_GETARG_NAME(0);
  	text	   *ruledef;
! 	Datum		args[2];
! 	char		nulls[3];
  	int			spirc;
  	HeapTuple	ruletup;
  	TupleDesc	rulettc;
  	StringInfoData buf;
  	int			len;
! 	char		name1[NAMEDATALEN + 5];
! 	char		name2[NAMEDATALEN + 5];
  
  	/* ----------
! 	 * We need the rules name somewhere deep down
  	 * ----------
  	 */
! 	rulename = pstrdup(NameStr(*rname));
  
  	/* ----------
  	 * Connect to SPI manager
--- 227,248 ----
  Datum
  pg_get_viewdef(PG_FUNCTION_ARGS)
  {
! 	Name		vname = PG_GETARG_NAME(0);
  	text	   *ruledef;
! 	Datum		args[1];
! 	char		nulls[2];
  	int			spirc;
  	HeapTuple	ruletup;
  	TupleDesc	rulettc;
  	StringInfoData buf;
  	int			len;
! 	char		*name;
  
  	/* ----------
! 	 * We need the view name somewhere deep down
  	 * ----------
  	 */
! 	rulename = pstrdup(NameStr(*vname));
  
  	/* ----------
  	 * Connect to SPI manager
***************
*** 259,286 ****
  	 */
  	if (plan_getview == NULL)
  	{
! 		Oid			argtypes[2];
  		void	   *plan;
  
  		argtypes[0] = NAMEOID;
! 		argtypes[1] = NAMEOID;
! 		plan = SPI_prepare(query_getview, 2, argtypes);
  		if (plan == NULL)
  			elog(ERROR, "SPI_prepare() failed for \"%s\"", query_getview);
  		plan_getview = SPI_saveplan(plan);
  	}
  
  	/* ----------
! 	 * Get the pg_rewrite tuple for this rule
  	 * ----------
  	 */
! 	sprintf(name1, "_RET%s", rulename);
! 	sprintf(name2, "_ret%s", rulename);
! 	args[0] = PointerGetDatum(name1);
! 	args[1] = PointerGetDatum(name2);
  	nulls[0] = ' ';
! 	nulls[1] = ' ';
! 	nulls[2] = '\0';
  	spirc = SPI_execp(plan_getview, args, nulls, 1);
  	if (spirc != SPI_OK_SELECT)
  		elog(ERROR, "failed to get pg_rewrite tuple for view %s", rulename);
--- 259,282 ----
  	 */
  	if (plan_getview == NULL)
  	{
! 		Oid			argtypes[1];
  		void	   *plan;
  
  		argtypes[0] = NAMEOID;
! 		plan = SPI_prepare(query_getview, 1, argtypes);
  		if (plan == NULL)
  			elog(ERROR, "SPI_prepare() failed for \"%s\"", query_getview);
  		plan_getview = SPI_saveplan(plan);
  	}
  
  	/* ----------
! 	 * Get the pg_rewrite tuple for this rule: rulename is actually viewname here
  	 * ----------
  	 */
! 	name = MakeRetrieveViewRuleName(rulename);
! 	args[0] = PointerGetDatum(name);
  	nulls[0] = ' ';
! 	nulls[1] = '\0';
  	spirc = SPI_execp(plan_getview, args, nulls, 1);
  	if (spirc != SPI_OK_SELECT)
  		elog(ERROR, "failed to get pg_rewrite tuple for view %s", rulename);
***************
*** 302,307 ****
--- 298,304 ----
  	VARATT_SIZEP(ruledef) = len;
  	memcpy(VARDATA(ruledef), buf.data, buf.len);
  	pfree(buf.data);
+ 	pfree(name);
  
  	/* ----------
  	 * Disconnect from SPI manager
Index: bin/pg_dump/pg_dump.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v
retrieving revision 1.163
diff -c -r1.163 pg_dump.c
*** bin/pg_dump/pg_dump.c	2000/08/07 12:32:54	1.163
--- bin/pg_dump/pg_dump.c	2000/08/30 15:58:09
***************
*** 256,267 ****
  {
  	PGresult   *res;
  	int			ntups;
  	PQExpBuffer query = createPQExpBuffer();
  
  	appendPQExpBuffer(query, "select relname from pg_class, pg_rewrite ");
  	appendPQExpBuffer(query, "where pg_class.oid = ev_class ");
  	appendPQExpBuffer(query, "and pg_rewrite.ev_type = '1' ");
! 	appendPQExpBuffer(query, "and rulename = '_RET%s'", relname);
  
  	res = PQexec(g_conn, query->data);
  	if (!res ||
--- 256,277 ----
  {
  	PGresult   *res;
  	int			ntups;
+ 	char       rulename[NAMEDATALEN + 5];
  	PQExpBuffer query = createPQExpBuffer();
  
  	appendPQExpBuffer(query, "select relname from pg_class, pg_rewrite ");
  	appendPQExpBuffer(query, "where pg_class.oid = ev_class ");
  	appendPQExpBuffer(query, "and pg_rewrite.ev_type = '1' ");
! 	snprintf(rulename,NAMEDATALEN + 5,"_RET%s",relname);
! #ifdef MULTIBYTE
! 	int len;
! 	len = pg_mbcliplen(rulename,strlen(rulename),NAMEDATALEN-1);
! 	rulename[len] = '\0';
! #else
! 	rulename[NAMEDATALEN-1] = '\0';
! #endif
! 
! 	appendPQExpBuffer(query, "and rulename = '%s'", rulename);
  
  	res = PQexec(g_conn, query->data);
  	if (!res ||