|
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 |
|
|