From 160675ecee07854d3767f722fb7ff76636bd8839 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sat, 13 Jan 2001 03:58:28 +0000
Subject: [PATCH] Relax test on typmod matching between a table and its
 proposed ON SELECT rule.  Needed to avoid failure when reloading a 7.0
 pg_dump of a view that has a NUMERIC column.

---
 src/backend/rewrite/rewriteDefine.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 4eb7d7e89d2..b0d959c5c24 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.56 2000/12/05 19:15:09 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.57 2001/01/13 03:58:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -283,7 +283,14 @@ DefineQueryRewrite(RuleStmt *stmt)
 			if (attr->atttypid != resdom->restype)
 				elog(ERROR, "select rule's target entry %d has different type from attribute %s", i, attname);
 
-			if (attr->atttypmod != resdom->restypmod)
+			/*
+			 * Allow typmods to be different only if one of them is -1,
+			 * ie, "unspecified".  This is necessary for cases like "numeric",
+			 * where the table will have a filled-in default length but the
+			 * select rule's expression will probably have typmod = -1.
+			 */
+			if (attr->atttypmod != resdom->restypmod &&
+				attr->atttypmod != -1 && resdom->restypmod != -1)
 				elog(ERROR, "select rule's target entry %d has different size from attribute %s", i, attname);
 		}
 
-- 
GitLab