DROP FUNCTION maverick_INDEX(text, text, integer); CREATE FUNCTION maverick_INDEX (text, text, integer) RETURNS integer AS ' DECLARE string ALIAS FOR $1; idx_string ALIAS FOR $2; index ALIAS FOR $3; i integer; idx_pos integer; real_pos integer := 0; len_string integer; tmp_string text; BEGIN tmp_string := string; len_string := char_length(string); FOR i IN 1..index LOOP idx_pos := position(idx_string IN tmp_string); IF idx_pos = 0 THEN RETURN 0; ELSE tmp_string := substring(tmp_string FROM (idx_pos + 1)); real_pos := real_pos + idx_pos; END IF; END LOOP; RETURN real_pos; END; ' LANGUAGE 'plpgsql'; DROP FUNCTION maverick_EXTRACT(text, integer, integer, integer); CREATE FUNCTION maverick_EXTRACT (text, integer, integer, integer) RETURNS text AS ' DECLARE in_string ALIAS FOR $1; attr ALIAS FOR $2; value ALIAS FOR $3; subvalue ALIAS FOR $4; delim_ord integer; delim char; str_len integer; pos_a integer; pos_b integer; i integer; this_value integer; tmp_string text; return_string text; BEGIN delim_ord := 255; str_len = char_length(in_string); tmp_string := in_string; IF str_len > 0 THEN FOR i IN 1..3 LOOP IF i = 1 THEN this_value := attr; ELSE IF i = 2 THEN this_value := value; ELSE this_value := subvalue; END IF; END IF; delim_ord := delim_ord - 1; delim := chr(delim_ord); IF this_value = 0 THEN RETURN tmp_string; ELSE IF this_value = 1 THEN pos_a := 1; ELSE pos_a := maverick_INDEX(tmp_string, delim, this_value - 1); IF pos_a = 0 THEN RETURN ''''; ELSE pos_a := pos_a + 1; END IF; END IF; pos_b := maverick_INDEX(tmp_string, delim, this_value); IF pos_b = 0 THEN tmp_string := substring(tmp_string FROM pos_a); ELSE tmp_string := substring(tmp_string FROM pos_a FOR (pos_b - pos_a)); END IF; END IF; END LOOP; ELSE RETURN ''''; END IF; RETURN tmp_string; END; ' LANGUAGE 'plpgsql';