diff options
Diffstat (limited to 'src/backend/regex/regc_lex.c')
-rw-r--r-- | src/backend/regex/regc_lex.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/src/backend/regex/regc_lex.c b/src/backend/regex/regc_lex.c index f6ed9f09ea4..bfd9dcd2a49 100644 --- a/src/backend/regex/regc_lex.c +++ b/src/backend/regex/regc_lex.c @@ -582,6 +582,8 @@ next(struct vars * v) { NOTE(REG_UNONPOSIX); v->now++; + if (ATEOS()) + FAILW(REG_BADRPT); switch (*v->now++) { case CHR(':'): /* non-capturing paren */ @@ -596,12 +598,31 @@ next(struct vars * v) return next(v); break; case CHR('='): /* positive lookahead */ - NOTE(REG_ULOOKAHEAD); - RETV(LACON, 1); + NOTE(REG_ULOOKAROUND); + RETV(LACON, LATYPE_AHEAD_POS); break; case CHR('!'): /* negative lookahead */ - NOTE(REG_ULOOKAHEAD); - RETV(LACON, 0); + NOTE(REG_ULOOKAROUND); + RETV(LACON, LATYPE_AHEAD_NEG); + break; + case CHR('<'): + if (ATEOS()) + FAILW(REG_BADRPT); + switch (*v->now++) + { + case CHR('='): /* positive lookbehind */ + NOTE(REG_ULOOKAROUND); + RETV(LACON, LATYPE_BEHIND_POS); + break; + case CHR('!'): /* negative lookbehind */ + NOTE(REG_ULOOKAROUND); + RETV(LACON, LATYPE_BEHIND_NEG); + break; + default: + FAILW(REG_BADRPT); + break; + } + assert(NOTREACHED); break; default: FAILW(REG_BADRPT); |