]> granicus.if.org Git - postgresql/commitdiff
Add routines to help with single-byte (internal) character type support.
authorThomas G. Lockhart <lockhart@fourpalms.org>
Sun, 13 Dec 1998 23:36:48 +0000 (23:36 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Sun, 13 Dec 1998 23:36:48 +0000 (23:36 +0000)
src/backend/utils/adt/char.c
src/backend/utils/adt/varlena.c
src/include/utils/builtins.h

index aec4bf8b192f94ad96850b44c0bab97b4d9faa7c..c5dbe3faecf9bd222e5a324ab00e9af7a93a65bd 100644 (file)
@@ -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.20 1998/12/13 23:35:48 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;
+}
index 963abf97b3d29941486968598fbe3f4e6501da1e..27f808712af107ba87054f3e5cb948146d9925d1 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.45 1998/12/08 06:19:15 thomas Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.46 1998/12/13 23:35:48 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++)
index a87c0c9c863094edfe81d0ac479776746d828dcc..f9ddf18e10107b1aa5047b8beebc4974fb844ff8 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: builtins.h,v 1.71 1998/12/08 06:18:34 thomas Exp $
+ * $Id: builtins.h,v 1.72 1998/12/13 23:36:48 thomas Exp $
  *
  * NOTES
  *       This should normally only be included by fmgr.h.
@@ -60,6 +60,8 @@ extern int8 charmi(int8 arg1, int8 arg2);
 extern int8 charmul(int8 arg1, int8 arg2);
 extern int8 chardiv(int8 arg1, int8 arg2);
 extern bool cideq(int8 arg1, int8 arg2);
+extern int8 text_char(text *arg1);
+extern text* char_text(int8 arg1);
 
 /* int.c */
 extern int32 int2in(char *num);