|
9 | 9 | *
|
10 | 10 | *
|
11 | 11 | * IDENTIFICATION
|
12 |
| - * $PostgreSQL: pgsql/src/backend/utils/adt/char.c,v 1.40 2004/08/29 04:12:51momjian Exp $ |
| 12 | + * $PostgreSQL: pgsql/src/backend/utils/adt/char.c,v 1.41 2004/10/04 22:49:51tgl Exp $ |
13 | 13 | *
|
14 | 14 | *-------------------------------------------------------------------------
|
15 | 15 | */
|
16 | 16 | #include"postgres.h"
|
17 | 17 |
|
| 18 | +#include<limits.h> |
| 19 | + |
18 | 20 | #include"libpq/pqformat.h"
|
19 | 21 | #include"utils/builtins.h"
|
20 | 22 |
|
| 23 | +#ifndefSCHAR_MAX |
| 24 | +#defineSCHAR_MAX (0x7F) |
| 25 | +#endif |
| 26 | +#ifndefSCHAR_MIN |
| 27 | +#defineSCHAR_MIN (-SCHAR_MAX-1) |
| 28 | +#endif |
| 29 | + |
| 30 | + |
21 | 31 | /*****************************************************************************
|
22 | 32 | * USER I/O ROUTINES *
|
23 | 33 | *****************************************************************************/
|
@@ -88,7 +98,7 @@ charsend(PG_FUNCTION_ARGS)
|
88 | 98 |
|
89 | 99 | /*
|
90 | 100 | * NOTE: comparisons are done as though char is unsigned (uint8).
|
91 |
| - *Arithmetic is done as though char is signed (int8). |
| 101 | + *Conversions to and from integer are done as though char is signed (int8). |
92 | 102 | *
|
93 | 103 | * You wanted consistency?
|
94 | 104 | */
|
@@ -147,45 +157,26 @@ charge(PG_FUNCTION_ARGS)
|
147 | 157 | PG_RETURN_BOOL((uint8)arg1 >= (uint8)arg2);
|
148 | 158 | }
|
149 | 159 |
|
150 |
| -Datum |
151 |
| -charpl(PG_FUNCTION_ARGS) |
152 |
| -{ |
153 |
| -chararg1=PG_GETARG_CHAR(0); |
154 |
| -chararg2=PG_GETARG_CHAR(1); |
155 |
| - |
156 |
| -PG_RETURN_CHAR((int8)arg1+ (int8)arg2); |
157 |
| -} |
158 | 160 |
|
159 | 161 | Datum
|
160 |
| -charmi(PG_FUNCTION_ARGS) |
| 162 | +chartoi4(PG_FUNCTION_ARGS) |
161 | 163 | {
|
162 | 164 | chararg1=PG_GETARG_CHAR(0);
|
163 |
| -chararg2=PG_GETARG_CHAR(1); |
164 | 165 |
|
165 |
| -PG_RETURN_CHAR((int8)arg1- (int8)arg2); |
| 166 | +PG_RETURN_INT32((int32) ((int8)arg1)); |
166 | 167 | }
|
167 | 168 |
|
168 | 169 | Datum
|
169 |
| -charmul(PG_FUNCTION_ARGS) |
| 170 | +i4tochar(PG_FUNCTION_ARGS) |
170 | 171 | {
|
171 |
| -chararg1=PG_GETARG_CHAR(0); |
172 |
| -chararg2=PG_GETARG_CHAR(1); |
173 |
| - |
174 |
| -PG_RETURN_CHAR((int8)arg1* (int8)arg2); |
175 |
| -} |
176 |
| - |
177 |
| -Datum |
178 |
| -chardiv(PG_FUNCTION_ARGS) |
179 |
| -{ |
180 |
| -chararg1=PG_GETARG_CHAR(0); |
181 |
| -chararg2=PG_GETARG_CHAR(1); |
| 172 | +int32arg1=PG_GETARG_INT32(0); |
182 | 173 |
|
183 |
| -if (arg2==0) |
| 174 | +if (arg1<SCHAR_MIN||arg1>SCHAR_MAX) |
184 | 175 | ereport(ERROR,
|
185 |
| -(errcode(ERRCODE_DIVISION_BY_ZERO), |
186 |
| -errmsg("division by zero"))); |
| 176 | +(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), |
| 177 | +errmsg("\"char\" out of range"))); |
187 | 178 |
|
188 |
| -PG_RETURN_CHAR((int8)arg1 / (int8)arg2); |
| 179 | +PG_RETURN_CHAR((int8)arg1); |
189 | 180 | }
|
190 | 181 |
|
191 | 182 |
|
|