mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Allow functions and operators on internally-identical types to succeed.
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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]);
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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 );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user