aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/varchar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/varchar.c')
-rw-r--r--src/backend/utils/adt/varchar.c80
1 files changed, 8 insertions, 72 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c
index cdf5c301d2e..e1181dd375f 100644
--- a/src/backend/utils/adt/varchar.c
+++ b/src/backend/utils/adt/varchar.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.91 2002/08/26 17:53:59 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.92 2002/08/29 07:22:27 ishii Exp $
*
*-------------------------------------------------------------------------
*/
@@ -21,9 +21,7 @@
#include "utils/builtins.h"
#include "utils/fmgroids.h"
-#ifdef MULTIBYTE
#include "mb/pg_wchar.h"
-#endif
/*
@@ -76,37 +74,26 @@ bpcharin(PG_FUNCTION_ARGS)
maxlen;
int i;
-#ifdef MULTIBYTE
int charlen; /* number of charcters in the input string */
char *ermsg;
-#endif
len = strlen(s);
-#ifdef MULTIBYTE
+
if ((ermsg = pg_verifymbstr(s, len)))
elog(ERROR, "%s", ermsg);
charlen = pg_mbstrlen(s);
-#endif
+
/* If typmod is -1 (or invalid), use the actual string length */
if (atttypmod < (int32) VARHDRSZ)
-#ifdef MULTIBYTE
maxlen = charlen;
-#else
- maxlen = len;
-#endif
else
maxlen = atttypmod - VARHDRSZ;
-#ifdef MULTIBYTE
if (charlen > maxlen)
-#else
- if (len > maxlen)
-#endif
{
/* Verify that extra characters are spaces, and clip them off */
-#ifdef MULTIBYTE
size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
/*
@@ -125,15 +112,7 @@ bpcharin(PG_FUNCTION_ARGS)
* the number of CHARACTERS!
*/
maxlen = len;
-#else
- if (strspn(s + maxlen, " ") == len - maxlen)
- len = maxlen;
- else
- elog(ERROR, "value too long for type character(%d)",
- (int) maxlen);
-#endif
}
-#ifdef MULTIBYTE
else
{
/*
@@ -142,7 +121,6 @@ bpcharin(PG_FUNCTION_ARGS)
*/
maxlen = len + (maxlen - charlen);
}
-#endif
result = palloc(maxlen + VARHDRSZ);
VARATT_SIZEP(result) = maxlen + VARHDRSZ;
@@ -202,26 +180,19 @@ bpchar(PG_FUNCTION_ARGS)
char *s;
int i;
-#ifdef MULTIBYTE
int charlen; /* number of charcters in the input string
* + VARHDRSZ */
-#endif
-
len = VARSIZE(source);
-#ifdef MULTIBYTE
+
charlen = pg_mbstrlen_with_len(VARDATA(source), len - VARHDRSZ) + VARHDRSZ;
-#endif
+
/* No work if typmod is invalid or supplied data matches it already */
if (maxlen < (int32) VARHDRSZ || len == maxlen)
PG_RETURN_BPCHAR_P(source);
-#ifdef MULTIBYTE
+
if (charlen > maxlen)
-#else
- if (len > maxlen)
-#endif
{
/* Verify that extra characters are spaces, and clip them off */
-#ifdef MULTIBYTE
size_t maxmblen;
maxmblen = pg_mbcharcliplen(VARDATA(source), len - VARHDRSZ,
@@ -239,16 +210,7 @@ bpchar(PG_FUNCTION_ARGS)
* length+VARHDRSZ, not the number of CHARACTERS!
*/
maxlen = len;
-#else
- for (i = maxlen - VARHDRSZ; i < len - VARHDRSZ; i++)
- if (*(VARDATA(source) + i) != ' ')
- elog(ERROR, "value too long for type character(%d)",
- maxlen - VARHDRSZ);
-
- len = maxlen;
-#endif
}
-#ifdef MULTIBYTE
else
{
/*
@@ -257,7 +219,6 @@ bpchar(PG_FUNCTION_ARGS)
*/
maxlen = len + (maxlen - charlen);
}
-#endif
s = VARDATA(source);
@@ -408,29 +369,22 @@ varcharin(PG_FUNCTION_ARGS)
size_t len,
maxlen;
-#ifdef MULTIBYTE
char *ermsg;
-#endif
len = strlen(s);
-#ifdef MULTIBYTE
+
if ((ermsg = pg_verifymbstr(s, len)))
elog(ERROR, "%s", ermsg);
-#endif
+
maxlen = atttypmod - VARHDRSZ;
if (atttypmod >= (int32) VARHDRSZ && len > maxlen)
{
/* Verify that extra characters are spaces, and clip them off */
-#ifdef MULTIBYTE
size_t mbmaxlen = pg_mbcharcliplen(s, len, maxlen);
if (strspn(s + mbmaxlen, " ") == len - mbmaxlen)
len = mbmaxlen;
-#else
- if (strspn(s + maxlen, " ") == len - maxlen)
- len = maxlen;
-#endif
else
elog(ERROR, "value too long for type character varying(%d)",
(int) maxlen);
@@ -493,7 +447,6 @@ varchar(PG_FUNCTION_ARGS)
/* only reach here if string is too long... */
-#ifdef MULTIBYTE
{
size_t maxmblen;
@@ -508,15 +461,6 @@ varchar(PG_FUNCTION_ARGS)
len = maxmblen;
}
-#else
- for (i = maxlen - VARHDRSZ; i < len - VARHDRSZ; i++)
- if (*(VARDATA(source) + i) != ' ')
- elog(ERROR, "value too long for type character varying(%d)",
- maxlen - VARHDRSZ);
-
- /* clip extra spaces */
- len = maxlen;
-#endif
result = palloc(len);
VARATT_SIZEP(result) = len;
@@ -584,7 +528,6 @@ bpcharlen(PG_FUNCTION_ARGS)
{
BpChar *arg = PG_GETARG_BPCHAR_P(0);
-#ifdef MULTIBYTE
/* optimization for single byte encoding */
if (pg_database_encoding_max_length() <= 1)
PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
@@ -592,9 +535,6 @@ bpcharlen(PG_FUNCTION_ARGS)
PG_RETURN_INT32(
pg_mbstrlen_with_len(VARDATA(arg), VARSIZE(arg) - VARHDRSZ)
);
-#else
- PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
-#endif
}
Datum
@@ -796,7 +736,6 @@ varcharlen(PG_FUNCTION_ARGS)
{
VarChar *arg = PG_GETARG_VARCHAR_P(0);
-#ifdef MULTIBYTE
/* optimization for single byte encoding */
if (pg_database_encoding_max_length() <= 1)
PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
@@ -804,9 +743,6 @@ varcharlen(PG_FUNCTION_ARGS)
PG_RETURN_INT32(
pg_mbstrlen_with_len(VARDATA(arg), VARSIZE(arg) - VARHDRSZ)
);
-#else
- PG_RETURN_INT32(VARSIZE(arg) - VARHDRSZ);
-#endif
}
Datum