|
9 | 9 | *
|
10 | 10 | *
|
11 | 11 | * IDENTIFICATION
|
12 |
| - * $PostgreSQL: pgsql/src/backend/utils/adt/char.c,v 1.40 2004/08/29 04:12:51 momjian Exp $ |
| 12 | + * $PostgreSQL: pgsql/src/backend/utils/adt/char.c,v 1.41 2004/10/04 22:49:51 tgl 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 | +#ifndef SCHAR_MAX |
| 24 | +#define SCHAR_MAX (0x7F) |
| 25 | +#endif |
| 26 | +#ifndef SCHAR_MIN |
| 27 | +#define SCHAR_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 |
| - char arg1 = PG_GETARG_CHAR(0); |
154 |
| - char arg2 = 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 | char arg1 = PG_GETARG_CHAR(0);
|
163 |
| - char arg2 = 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 |
| - char arg1 = PG_GETARG_CHAR(0); |
172 |
| - char arg2 = PG_GETARG_CHAR(1); |
173 |
| - |
174 |
| - PG_RETURN_CHAR((int8) arg1 * (int8) arg2); |
175 |
| -} |
176 |
| - |
177 |
| -Datum |
178 |
| -chardiv(PG_FUNCTION_ARGS) |
179 |
| -{ |
180 |
| - char arg1 = PG_GETARG_CHAR(0); |
181 |
| - char arg2 = PG_GETARG_CHAR(1); |
| 172 | + int32 arg1 = 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 |
|
|
0 commit comments