From afa71c7661989651528b87ad5c6690f5e9c44fcf Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Mon, 14 Dec 1998 00:13:56 +0000 Subject: Add routines to help with single-byte (internal) character type support. --- src/backend/utils/adt/char.c | 22 ++++++++++++++++++++-- src/backend/utils/adt/varlena.c | 30 +++++++++++++++++++----------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/backend/utils/adt/char.c b/src/backend/utils/adt/char.c index aec4bf8b19..e4b0c64090 100644 --- a/src/backend/utils/adt/char.c +++ b/src/backend/utils/adt/char.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.19 1998/09/01 03:25:50 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/char.c,v 1.19.2.1 1998/12/14 00:13:55 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -29,7 +29,7 @@ int32 charin(char *ch) { if (ch == NULL) - return (int32) NULL; + return (int32) '\0'; return (int32) *ch; } @@ -153,3 +153,21 @@ cideq(int8 arg1, int8 arg2) { return arg1 == arg2; } + +int8 +text_char(text *arg1) +{ + return ((int8) *(VARDATA(arg1))); +} + +text * +char_text(int8 arg1) +{ + text *result; + + result = palloc(VARHDRSZ+1); + VARSIZE(result) = VARHDRSZ+1; + *(VARDATA(result)) = arg1; + + return result; +} diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 4be36bbba8..38bd689070 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.44 1998/10/08 18:30:12 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.44.2.1 1998/12/14 00:13:56 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -313,9 +313,8 @@ textcat(text *t1, text *t2) * - starting position (is one-based) * - string length * - * If the starting position is zero or less, then return the entire string. - * XXX Note that this may not be the right behavior: - * if we are calculating the starting position we might want it to start at one. + * If the starting position is zero or less, then return from the start of the string + * adjusting the length to be consistant with the "negative start" per SQL92. * If the length is less than zero, return the remaining string. * * Note that the arguments operate on octet length, @@ -323,6 +322,9 @@ textcat(text *t1, text *t2) * * Added multi-byte support. * - Tatsuo Ishii 1998-4-21 + * Changed behavior if starting position is less than one to conform to SQL92 behavior. + * Formerly returned the entire string; now returns a portion. + * - Thomas Lockhart 1998-12-10 */ text * text_substr(text *string, int32 m, int32 n) @@ -336,7 +338,7 @@ text_substr(text *string, int32 m, int32 n) #endif - if ((string == (text *) NULL) || (m <= 0)) + if (string == (text *) NULL) return string; len = VARSIZE(string) - VARHDRSZ; @@ -344,19 +346,25 @@ text_substr(text *string, int32 m, int32 n) len = pg_mbstrlen_with_len(VARDATA(string), len); #endif - /* m will now become a zero-based starting position */ + /* starting position after the end of the string? */ if (m > len) { - m = 0; + m = 1; n = 0; } - else + /* starting position before the start of the string? + * then offset into the string per SQL92 spec... */ + else if (m < 1) { - m--; - if (((m + n) > len) || (n < 0)) - n = (len - m); + n += (m-1); + m = 1; } + /* m will now become a zero-based starting position */ + m--; + if (((m + n) > len) || (n < 0)) + n = (len - m); + #ifdef MULTIBYTE p = VARDATA(string); for (i = 0; i < m; i++) -- cgit v1.2.1