From 3dd23aadf0746ba53ffe3ca76863a0ffbbeb0c68 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Fri, 22 Aug 1997 00:02:19 +0000
Subject: [PATCH] Allow functions and operators on internally-identical types
 to succeed.

---
 src/backend/parser/analyze.c       |  4 ++--
 src/backend/parser/catalog_utils.c | 14 ++++++++++++--
 src/backend/parser/parse_query.c   |  5 +++--
 src/backend/parser/parser.c        | 15 ++++++++++++++-
 src/include/catalog/pg_type.h      |  3 ++-
 5 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 6c703b77814..9b4c88b9ae9 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.34 1997/08/19 21:32:11 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.35 1997/08/22 00:02:04 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1345,7 +1345,7 @@ make_targetlist_expr(ParseState *pstate,
 	  } else
 	       if (attrtype != type_id) {
 		    if ((attrtype == INT2OID) && (type_id == INT4OID))
-			 lfirst(expr) = lispInteger (INT2OID);
+			 lfirst(expr) = lispInteger (INT2OID); do CASHOID too
                     else if ((attrtype == FLOAT4OID) && (type_id == FLOAT8OID))
 			 lfirst(expr) = lispInteger (FLOAT4OID);
                     else
diff --git a/src/backend/parser/catalog_utils.c b/src/backend/parser/catalog_utils.c
index 43419883411..043c2865060 100644
--- a/src/backend/parser/catalog_utils.c
+++ b/src/backend/parser/catalog_utils.c
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.21 1997/08/19 21:32:12 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/catalog_utils.c,v 1.22 1997/08/22 00:02:05 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -373,6 +373,7 @@ equivalentOpersAfterPromotion(CandidateList candidates)
 	case FLOAT4OID:
 	case INT4OID:
 	case INT2OID:
+	case CASHOID:
 	    c->args[0] = FLOAT8OID;
 	    break;
 	default:
@@ -383,6 +384,7 @@ equivalentOpersAfterPromotion(CandidateList candidates)
 	case FLOAT4OID:
 	case INT4OID:
 	case INT2OID:
+	case CASHOID:
 	    c->args[1] = FLOAT8OID;
 	    break;
 	default:
@@ -570,6 +572,7 @@ unary_oper_get_candidates(char *op,
     opKey[1].sk_argument = CharGetDatum(rightleft);
     
     /* currently, only "unknown" can be coerced */
+    /* but we should allow types that are internally the same to be "coerced" */
     if (typeId != UNKNOWNOID) {
         return 0;
     }
@@ -956,7 +959,14 @@ can_coerce(int nargs, Oid *input_typeids, Oid *func_typeids)
      */
     for (i=0; i<nargs; i++) {
 	if (input_typeids[i] != func_typeids[i]) {
-	    if (input_typeids[i] != UNKNOWNOID || func_typeids[i] == 0)
+	    if ((input_typeids[i] == BPCHAROID && func_typeids[i] == TEXTOID) ||
+	        (input_typeids[i] == BPCHAROID && func_typeids[i] == VARCHAROID) ||
+	        (input_typeids[i] == VARCHAROID && func_typeids[i] == TEXTOID) ||
+	        (input_typeids[i] == VARCHAROID && func_typeids[i] == BPCHAROID) ||
+	        (input_typeids[i] == CASHOID && func_typeids[i] == INT4OID) ||
+	        (input_typeids[i] == INT4OID && func_typeids[i] == CASHOID))
+	       ; /* these are OK */
+	    else if (input_typeids[i] != UNKNOWNOID || func_typeids[i] == 0)
 		return false;
 	    
 	    tp = get_id_type(input_typeids[i]);
diff --git a/src/backend/parser/parse_query.c b/src/backend/parser/parse_query.c
index e608a2dc6b9..b19b291769f 100644
--- a/src/backend/parser/parse_query.c
+++ b/src/backend/parser/parse_query.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.17 1997/08/19 21:32:16 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/Attic/parse_query.c,v 1.18 1997/08/22 00:02:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -378,7 +378,8 @@ make_op(char *opname, Node *ltree, Node *rtree)
 				(t) == INT4OID || \
 				(t) == OIDOID || \
 				(t) == FLOAT4OID || \
-				(t) == FLOAT8OID)
+				(t) == FLOAT8OID || \
+				(t) == CASHOID)
 	
 	/* binary operator */
 	ltypeId = (ltree==NULL) ? UNKNOWNOID : exprType(ltree);
diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c
index 14f110767f3..44e8ef91006 100644
--- a/src/backend/parser/parser.c
+++ b/src/backend/parser/parser.c
@@ -6,7 +6,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.20 1997/08/03 02:28:10 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/parser/parser.c,v 1.21 1997/08/22 00:02:08 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -238,6 +238,13 @@ parser_typecast(Value *expr, TypeName *typename, int typlen)
 	string_palloced = true;
 	sprintf(const_string,"%f", ((Const)lnext(expr))->constvalue);
 	break;
+
+    case CASHOID: /* money */
+	const_string = (char *) palloc(256);
+	string_palloced = true;
+	sprintf(const_string,"%ld",
+		(int) ((Const*)expr)->constvalue);
+	break;
 	
     case TEXTOID: /* text */
 	const_string = DatumGetPointer(((Const)lnext(expr))->constvalue);
@@ -350,6 +357,12 @@ parser_typecast2(Node *expr, Oid exprType, Type tp, int typlen)
 	    sprintf(const_string,"%f", *floatVal);
 	    break;
 	}
+    case CASHOID: /* money */
+	const_string = (char *) palloc(256);
+	string_palloced = true;
+	sprintf(const_string,"%ld",
+		(long) ((Const*)expr)->constvalue);
+	break;
     case TEXTOID: /* text */
 	const_string = 
 	    DatumGetPointer(((Const*)expr)->constvalue );
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index c2be12bb48a..3ed49b8b5ef 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_type.h,v 1.14 1997/08/21 01:37:55 vadim Exp $
+ * $Id: pg_type.h,v 1.15 1997/08/22 00:02:19 momjian Exp $
  *
  * NOTES
  *    the genbki.sh script reads this file and generates .bki
@@ -242,6 +242,7 @@ DATA(insert OID = 705 (  unknown   PGUID -1  -1 f b t \054 0   18 textin textout
 DATA(insert OID = 718 (  circle    PGUID  24 47 f b t \054 0    0 circle_in circle_out circle_in circle_out d _null_ ));
 DATA(insert OID = 719 (  _circle   PGUID  -1 -1 f b t \054 0  718 array_in array_out array_in array_out d _null_ ));
 DATA(insert OID = 790 (  money     PGUID   4 24 f b t \054 0    0 cash_in cash_out cash_in cash_out i _null_ ));
+#define CASHOID 790
 DATA(insert OID = 791 (  _money    PGUID  -1 -1 f b t \054 0  790 array_in array_out array_in array_out i _null_ ));
 
 /* OIDS 800 - 899 */
-- 
GitLab