38 #define PG_GETARG_TEXT_PP_IF_EXISTS(_n) \
39 (PG_NARGS() > (_n) ? PG_GETARG_TEXT_PP(_n) : NULL)
89 #ifndef MAX_CACHED_RES
90 #define MAX_CACHED_RES 32
112 bool use_subpatterns,
113 bool ignore_degenerate);
150 if (re_array[i].cre_pat_len == text_re_len &&
151 re_array[i].cre_flags == cflags &&
152 re_array[i].cre_collation == collation &&
153 memcmp(re_array[i].cre_pat, text_re_val, text_re_len) == 0)
160 re_temp = re_array[
i];
162 re_array[0] = re_temp;
165 return &re_array[0].
cre_re;
193 (
errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
194 errmsg(
"invalid regular expression: %s", errMsg)));
208 (
errcode(ERRCODE_OUT_OF_MEMORY),
209 errmsg(
"out of memory")));
211 memcpy(re_temp.
cre_pat, text_re_val, text_re_len);
225 free(re_array[num_res].cre_pat);
231 re_array[0] = re_temp;
234 return &re_array[0].
cre_re;
253 int start_search,
int nmatch,
regmatch_t *pmatch)
271 pg_regerror(regexec_result, re, errMsg,
sizeof(errMsg));
273 (
errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
274 errmsg(
"regular expression failed: %s", errMsg)));
277 return (regexec_result ==
REG_OKAY);
329 int cflags,
Oid collation,
337 return RE_execute(re, dat, dat_len, nmatch, pmatch);
363 for (i = 0; i < opt_len; i++)
410 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
411 errmsg(
"invalid regexp option: \"%c\"",
575 so = pmatch[1].
rm_so;
576 eo = pmatch[1].
rm_eo;
581 so = pmatch[0].
rm_so;
582 eo = pmatch[0].
rm_eo;
591 if (so < 0 || eo < 0)
657 bool afterescape =
false;
658 bool incharclass =
false;
682 (
errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),
683 errmsg(
"invalid escape string"),
684 errhint(
"Escape string must be empty or one character.")));
718 if (pchar ==
'"' && !incharclass)
719 *r++ = ((nquotes++ % 2) == 0) ?
'(' :
')';
727 else if (e && pchar == *e)
732 else if (incharclass)
740 else if (pchar ==
'[')
745 else if (pchar ==
'%')
750 else if (pchar ==
'_')
752 else if (pchar ==
'(')
759 else if (pchar ==
'\\' || pchar ==
'.' ||
760 pchar ==
'^' || pchar ==
'$')
851 bool force_glob,
bool use_subpatterns,
852 bool ignore_degenerate)
882 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
883 errmsg(
"regexp_split does not support the global option")));
885 re_flags.
glob =
true;
892 if (use_subpatterns && cpattern->
re_nsub > 0)
895 pmatch_len = cpattern->
re_nsub + 1;
899 use_subpatterns =
false;
908 array_len = re_flags.
glob ? 256 : 32;
923 if (!ignore_degenerate ||
924 (pmatch[0].rm_so < wide_len &&
925 pmatch[0].rm_eo > prev_match_end))
928 while (array_idx + matchctx->
npatterns * 2 > array_len)
932 sizeof(
int) * array_len);
940 for (i = 1; i <= matchctx->
npatterns; i++)
953 prev_match_end = pmatch[0].
rm_eo;
965 start_search = prev_match_end;
966 if (pmatch[0].rm_so == pmatch[0].rm_eo)
968 if (start_search > wide_len)
1001 bool *nulls = matchctx->
nulls;
1009 for (i = 0; i < matchctx->
npatterns; i++)
1014 if (so < 0 || eo < 0)
1151 elog(
ERROR,
"invalid match ending position");
1156 if (endpos < startpos)
1157 elog(
ERROR,
"invalid match starting position");
1195 if (case_insensitive)
1219 pg_regerror(re_result, re, errMsg,
sizeof(errMsg));
1221 (
errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
1222 errmsg(
"regular expression failed: %s", errMsg)));
1228 result = (
char *)
palloc(maxlen);