Skip to content

Commit

Permalink
Rethink flex flags for syncrep_scanner.l.
Browse files Browse the repository at this point in the history
Using flex's -i switch to achieve case-insensitivity is not a very safe
practice, because the scanner's behavior may then depend on the locale
that flex was invoked in.  In the particular example at hand, that's
not academic: the possible matches for "FIRST" will be different in a
Turkish locale than elsewhere.  Do it the hard way instead, as our
other scanners do.

Also, drop use of -b -CF -p, because this scanner is only used when
parsing the contents of a GUC variable.  That's not done often, and
the amount of text to be parsed can be expected to be trivial, so
prioritizing scanner speed over code size seems like quite the wrong
tradeoff.  Using flex's default optimization options reduces the
size of syncrep_gram.o by more than 50%.

The case-insensitivity problem is new in HEAD (cf commit 3901fd7).
The poor choice of optimization flags exists also in 9.6, but it doesn't
seem important enough to back-patch.

Discussion: https://postgr.es/m/[email protected]
  • Loading branch information
tglsfdc committed May 19, 2017
1 parent a95410e commit 5c837dd
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 5 deletions.
5 changes: 2 additions & 3 deletions src/backend/replication/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,9 @@ include $(top_srcdir)/src/backend/common.mk
# repl_scanner is compiled as part of repl_gram
repl_gram.o: repl_scanner.c

# syncrep_scanner is complied as part of syncrep_gram
# syncrep_scanner is compiled as part of syncrep_gram
syncrep_gram.o: syncrep_scanner.c
syncrep_scanner.c: FLEXFLAGS = -CF -p -i
syncrep_scanner.c: FLEX_NO_BACKUP=yes

# repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c
# are in the distribution tarball, so they are not cleaned here.
# (Our parent Makefile takes care of them during maintainer-clean.)
6 changes: 4 additions & 2 deletions src/backend/replication/syncrep_scanner.l
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@ xdinside [^"]+
%%
{space}+ { /* ignore */ }

ANY { return ANY; }
FIRST { return FIRST; }
/* brute-force case insensitivity is safer than relying on flex -i */

[Aa][Nn][Yy] { return ANY; }
[Ff][Ii][Rr][Ss][Tt] { return FIRST; }

{xdstart} {
initStringInfo(&xdbuf);
Expand Down

0 comments on commit 5c837dd

Please sign in to comment.