64 bool use_subpatterns);
185 pg_regerror(regcomp_result, result_re, errMsg,
sizeof(errMsg));
187 (
errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
188 errmsg(
"invalid regular expression: %s", errMsg)));
211 for (
int i = 0;
i < nmatch;
i++)
213 pmatch[
i].rm_so = -1;
214 pmatch[
i].rm_eo = -1;
230 pg_regerror(regexec_result, re, errMsg,
sizeof(errMsg));
232 (
errcode(ERRCODE_INVALID_REGULAR_EXPRESSION),
233 errmsg(
"regular expression failed: %s", errMsg)));
236 return (regexec_result ==
REG_OKAY);
264 for (
i = 0;
i < opt_len;
i++)
293 cflags &= ~REG_NLANCH;
296 cflags &= ~REG_NLSTOP;
308 cflags &= ~REG_ADVANCED;
325 cflags &= ~REG_ADVANCED;
329 cflags &= ~REG_ADVANCED;
412 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
413 errmsg(
"invalid regular expression test option: \"%.*s\"",
435 bool use_subpatterns)
462 if (use_subpatterns && cpattern->re_nsub > 0)
464 matchctx->
npatterns = cpattern->re_nsub + 1;
465 pmatch_len = cpattern->re_nsub + 1;
469 use_subpatterns =
false;
483 array_len = re_flags->
glob ? 255 : 31;
497 while (array_idx + matchctx->
npatterns * 2 + 1 > array_len)
499 array_len += array_len + 1;
502 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
503 errmsg(
"too many regular expression matches")));
505 sizeof(
int) * array_len);
511 int so = pmatch[
i].rm_so;
512 int eo = pmatch[
i].rm_eo;
516 if (so >= 0 && eo >= 0 && (eo - so) > maxlen)
520 prev_match_end = pmatch[0].rm_eo;
532 start_search = prev_match_end;
533 if (pmatch[0].rm_so == pmatch[0].rm_eo)
535 if (start_search > wide_len)
546 while (array_idx + matchctx->
npatterns * 2 + 1 > array_len)
548 array_len += array_len + 1;
551 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
552 errmsg(
"too many regular expression matches")));
554 sizeof(
int) * array_len);
568 Assert(array_idx <= array_len);
585 if (maxsiz > orig_len)
586 conv_bufsiz = orig_len + 1;
588 conv_bufsiz = maxsiz + 1;
623 static const struct infoname infonames[] = {
640 const struct infoname *inf;
652 for (inf = infonames; inf->bit != 0; inf++)
654 if (cpattern->re_info & inf->bit)
656 if (flags->
info & inf->bit)
666 if (flags->
info & inf->bit)
679 TEXTOID, -1,
false, TYPALIGN_INT);
693 bool *nulls = matchctx->
nulls;
711 snprintf(bufstr,
sizeof(bufstr),
"%d %d",
712 so, so < 0 ? eo : eo - 1);
716 else if (so < 0 || eo < 0)
727 Assert(len < matchctx->conv_bufsiz);
747 snprintf(bufstr,
sizeof(bufstr),
"%d %d",
748 so, so < 0 ? eo : eo - 1);
759 TEXTOID, -1,
false, TYPALIGN_INT);
ArrayType * construct_md_array(Datum *elems, bool *nulls, int ndims, int *dims, int *lbs, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define palloc_array(type, count)
#define palloc0_object(type)
#define PG_GETARG_TEXT_PP(n)
#define DirectFunctionCall3(func, arg1, arg2, arg3)
#define PG_GET_COLLATION()
#define PG_GETARG_TEXT_P_COPY(n)
#define SRF_IS_FIRSTCALL()
#define SRF_PERCALL_SETUP()
#define SRF_RETURN_NEXT(_funcctx, _result)
#define SRF_FIRSTCALL_INIT()
#define SRF_RETURN_DONE(_funcctx)
Assert(PointerIsAligned(start, uint64))
if(TABLE==NULL||TABLE_index==NULL)
int pg_wchar2mb_with_len(const pg_wchar *from, char *to, int len)
int pg_database_encoding_max_length(void)
int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len)
int pg_mblen(const char *mbstr)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static AmcheckOptions opts
static char buf[DEFAULT_XLOG_SEG_SIZE]
static Datum PointerGetDatum(const void *X)
static Datum Int32GetDatum(int32 X)
int pg_regcomp(regex_t *re, const chr *string, size_t len, int flags, Oid collation)
size_t pg_regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
int pg_regexec(regex_t *re, const chr *string, size_t len, size_t search_start, rm_detail_t *details, size_t nmatch, regmatch_t pmatch[], int flags)
void pg_regfree(regex_t *re)
MemoryContext multi_call_memory_ctx
PG_FUNCTION_INFO_V1(test_regex)
struct test_re_flags test_re_flags
static test_regex_ctx * setup_test_matches(text *orig_str, regex_t *cpattern, test_re_flags *re_flags, Oid collation, bool use_subpatterns)
static void test_re_compile(text *text_re, int cflags, Oid collation, regex_t *result_re)
struct test_regex_ctx test_regex_ctx
static ArrayType * build_test_match_result(test_regex_ctx *matchctx)
static bool test_re_execute(regex_t *re, pg_wchar *data, int data_len, int start_search, rm_detail_t *details, int nmatch, regmatch_t *pmatch, int eflags)
Datum test_regex(PG_FUNCTION_ARGS)
static void parse_test_flags(test_re_flags *flags, text *opts)
static ArrayType * build_test_info_result(regex_t *cpattern, test_re_flags *flags)
static Size VARSIZE_ANY_EXHDR(const void *PTR)
static char * VARDATA_ANY(const void *PTR)
Datum bit(PG_FUNCTION_ARGS)
Datum text_substr(PG_FUNCTION_ARGS)
text * cstring_to_text_with_len(const char *s, int len)
text * cstring_to_text(const char *s)