diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index c877a70cccc..8165e9bac26 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -5531,27 +5531,29 @@ $$ LANGUAGE plpgsql STRICT IMMUTABLE;
instr> function
-
+ 0 THEN
temp_str := substring(string FROM beg_index);
- pos := position(string_to_search IN temp_str);
+ pos := position(string_to_search_for IN temp_str);
IF pos = 0 THEN
RETURN 0;
ELSE
RETURN pos + beg_index - 1;
END IF;
- ELSIF beg_index < 0 THEN
- ss_length := char_length(string_to_search);
+ ELSIF beg_index < 0 THEN
+ ss_length := char_length(string_to_search_for);
length := char_length(string);
- beg := length + beg_index - ss_length + 2;
+ beg := length + 1 + beg_index;
- WHILE beg > 0 LOOP
+ WHILE beg > 0 LOOP
temp_str := substring(string FROM beg FOR ss_length);
- pos := position(string_to_search IN temp_str);
-
- IF pos > 0 THEN
+ IF string_to_search_for = temp_str THEN
RETURN beg;
END IF;
@@ -5593,7 +5593,7 @@ END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;
-CREATE FUNCTION instr(string varchar, string_to_search varchar,
+CREATE FUNCTION instr(string varchar, string_to_search_for varchar,
beg_index integer, occur_index integer)
RETURNS integer AS $$
DECLARE
@@ -5605,39 +5605,32 @@ DECLARE
length integer;
ss_length integer;
BEGIN
- IF beg_index > 0 THEN
- beg := beg_index;
- temp_str := substring(string FROM beg_index);
+ IF occur_index <= 0 THEN
+ RAISE 'argument ''%'' is out of range', occur_index
+ USING ERRCODE = '22003';
+ END IF;
+ IF beg_index > 0 THEN
+ beg := beg_index - 1;
FOR i IN 1..occur_index LOOP
- pos := position(string_to_search IN temp_str);
-
- IF i = 1 THEN
- beg := beg + pos - 1;
- ELSE
- beg := beg + pos;
- END IF;
-
temp_str := substring(string FROM beg + 1);
+ pos := position(string_to_search_for IN temp_str);
+ IF pos = 0 THEN
+ RETURN 0;
+ END IF;
+ beg := beg + pos;
END LOOP;
- IF pos = 0 THEN
- RETURN 0;
- ELSE
- RETURN beg;
- END IF;
- ELSIF beg_index < 0 THEN
- ss_length := char_length(string_to_search);
+ RETURN beg;
+ ELSIF beg_index < 0 THEN
+ ss_length := char_length(string_to_search_for);
length := char_length(string);
- beg := length + beg_index - ss_length + 2;
+ beg := length + 1 + beg_index;
- WHILE beg > 0 LOOP
+ WHILE beg > 0 LOOP
temp_str := substring(string FROM beg FOR ss_length);
- pos := position(string_to_search IN temp_str);
-
- IF pos > 0 THEN
+ IF string_to_search_for = temp_str THEN
occur_number := occur_number + 1;
-
IF occur_number = occur_index THEN
RETURN beg;
END IF;
@@ -5652,6 +5645,7 @@ BEGIN
END IF;
END;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;
+]]>