aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/varlena.c
diff options
context:
space:
mode:
authorTatsuo Ishii <ishii@postgresql.org>2002-04-15 07:54:37 +0000
committerTatsuo Ishii <ishii@postgresql.org>2002-04-15 07:54:37 +0000
commitc4e0c113b8f7069be6a866a25f121611908fd07c (patch)
tree64ca98602281c369f43b0b8629187a611b53d88e /src/backend/utils/adt/varlena.c
parent3767970cbf2d07a4e90500ebab105424d19c415e (diff)
downloadpostgresql-c4e0c113b8f7069be6a866a25f121611908fd07c.tar.gz
postgresql-c4e0c113b8f7069be6a866a25f121611908fd07c.zip
Fix text_substr bug intrduced in 7.3 development
using Joe Conway's patches (submitted at pgsql-patches on 2002/04/08) + small fix.
Diffstat (limited to 'src/backend/utils/adt/varlena.c')
-rw-r--r--src/backend/utils/adt/varlena.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c
index 0cd38a76bee..2007e78910f 100644
--- a/src/backend/utils/adt/varlena.c
+++ b/src/backend/utils/adt/varlena.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.82 2002/04/03 05:39:32 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.83 2002/04/15 07:54:37 ishii Exp $
*
*-------------------------------------------------------------------------
*/
@@ -373,7 +373,10 @@ text_substr(PG_FUNCTION_ARGS)
if (eml > 1)
{
sm = 0;
- sn = (m + n) * eml + 3; /* +3 to avoid mb characters overhanging slice end */
+ if (n > -1)
+ sn = (m + n) * eml + 3; /* +3 to avoid mb characters overhanging slice end */
+ else
+ sn = n; /* n < 0 is special-cased by heap_tuple_untoast_attr_slice */
}
#endif
@@ -387,7 +390,10 @@ text_substr(PG_FUNCTION_ARGS)
PG_RETURN_NULL(); /* notreached: suppress compiler warning */
#endif
#ifdef MULTIBYTE
- len = pg_mbstrlen_with_len (VARDATA (string), sn - 3);
+ if (n > -1)
+ len = pg_mbstrlen_with_len (VARDATA (string), sn - 3);
+ else /* n < 0 is special-cased; need full string length */
+ len = pg_mbstrlen_with_len (VARDATA (string), VARSIZE(string)-VARHDRSZ);
if (m > len)
{