Fix lpad() and rpad() to produce correct results in variable-length
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 Jan 2002 17:03:41 +0000 (17:03 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 8 Jan 2002 17:03:41 +0000 (17:03 +0000)
multibyte encodings.

src/backend/utils/adt/oracle_compat.c

index 9b089ac725325a1ea188ae1ef5fc7fe6a2c27b77..3e518725ef387621b12fc7fbfbf5eb2648ef08c3 100644 (file)
@@ -200,10 +200,8 @@ lpad(PG_FUNCTION_ARGS)
 #ifdef MULTIBYTE
        bytelen = pg_database_encoding_max_length() * len;
        ret = (text *) palloc(VARHDRSZ + bytelen);
-       VARATT_SIZEP(ret) = VARHDRSZ + bytelen;
 #else
        ret = (text *) palloc(VARHDRSZ + len);
-       VARATT_SIZEP(ret) = VARHDRSZ + len;
 #endif
        m = len - s1len;
 
@@ -247,6 +245,8 @@ lpad(PG_FUNCTION_ARGS)
                *ptr_ret++ = *ptr1++;
 #endif
 
+       VARATT_SIZEP(ret) = ptr_ret - (char *) ret;
+
        PG_RETURN_TEXT_P(ret);
 }
 
@@ -311,10 +311,8 @@ rpad(PG_FUNCTION_ARGS)
 #ifdef MULTIBYTE
        bytelen = pg_database_encoding_max_length() * len;
        ret = (text *) palloc(VARHDRSZ + bytelen);
-       VARATT_SIZEP(ret) = VARHDRSZ + bytelen;
 #else
        ret = (text *) palloc(VARHDRSZ + len);
-       VARATT_SIZEP(ret) = VARHDRSZ + len;
 #endif
        m = len - s1len;
 
@@ -358,6 +356,8 @@ rpad(PG_FUNCTION_ARGS)
        }
 #endif
 
+       VARATT_SIZEP(ret) = ptr_ret - (char *) ret;
+
        PG_RETURN_TEXT_P(ret);
 }