From 67d63a9e186e6e393e344627c5b70f2dd7b8609e Mon Sep 17 00:00:00 2001 From: John Naylor Date: Fri, 12 Aug 2022 17:09:45 +0700 Subject: [PATCH v4 05/11] Build repl_scanner.c standalone --- src/backend/Makefile | 3 ++- src/backend/replication/.gitignore | 1 + src/backend/replication/Makefile | 11 +++++++-- src/backend/replication/repl_gram.y | 2 -- src/backend/replication/repl_scanner.l | 31 +++++++++++++++++--------- src/tools/pginclude/headerscheck | 1 + 6 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/backend/Makefile b/src/backend/Makefile index 5a12666918..f527659a7b 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -183,7 +183,7 @@ distprep: $(MAKE) -C bootstrap bootparse.c bootparse.h bootscanner.c $(MAKE) -C catalog distprep $(MAKE) -C nodes distprep - $(MAKE) -C replication repl_gram.c repl_scanner.c syncrep_gram.c syncrep_scanner.c + $(MAKE) -C replication repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_scanner.c $(MAKE) -C storage/lmgr lwlocknames.h lwlocknames.c $(MAKE) -C utils distprep $(MAKE) -C utils/adt jsonpath_gram.c jsonpath_scan.c @@ -304,6 +304,7 @@ maintainer-clean: distclean parser/gram.h \ parser/scan.c \ replication/repl_gram.c \ + replication/repl_gram.h \ replication/repl_scanner.c \ replication/syncrep_gram.c \ replication/syncrep_scanner.c \ diff --git a/src/backend/replication/.gitignore b/src/backend/replication/.gitignore index d1df6147bd..a5f600232f 100644 --- a/src/backend/replication/.gitignore +++ b/src/backend/replication/.gitignore @@ -1,3 +1,4 @@ +/repl_gram.h /repl_gram.c /repl_scanner.c /syncrep_gram.c diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile index 2bffac58c0..bc8170418f 100644 --- a/src/backend/replication/Makefile +++ b/src/backend/replication/Makefile @@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) OBJS = \ repl_gram.o \ + repl_scanner.o \ slot.o \ slotfuncs.o \ syncrep.o \ @@ -28,8 +29,14 @@ SUBDIRS = logical include $(top_srcdir)/src/backend/common.mk -# repl_scanner is compiled as part of repl_gram -repl_gram.o: repl_scanner.c +# See notes in src/backend/parser/Makefile about the following two rules +repl_gram.h: repl_gram.c + touch $@ + +repl_gram.c: BISONFLAGS += -d + +# Force these dependencies to be known even without dependency info built: +repl_gram.o repl_scanner.o: repl_gram.h # syncrep_scanner is compiled as part of syncrep_gram syncrep_gram.o: syncrep_scanner.c diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y index 4cf087e602..b343f108d3 100644 --- a/src/backend/replication/repl_gram.y +++ b/src/backend/replication/repl_gram.y @@ -416,5 +416,3 @@ ident_or_keyword: ; %% - -#include "repl_scanner.c" diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l index 586f0d3a5c..23fcb2a11d 100644 --- a/src/backend/replication/repl_scanner.l +++ b/src/backend/replication/repl_scanner.l @@ -1,4 +1,4 @@ -%{ +%top{ /*------------------------------------------------------------------------- * * repl_scanner.l @@ -18,6 +18,15 @@ #include "utils/builtins.h" #include "parser/scansup.h" +/* + * NB: include repl_gram.h only AFTER including walsender_private.h, because + * walsender_private includes headers that define XLogRecPtr. + */ +#include "replication/walsender_private.h" +#include "repl_gram.h" +} + +%{ /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */ #undef fprintf #define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg) @@ -130,7 +139,7 @@ WAIT { return K_WAIT; } {space}+ { /* do nothing */ } {digit}+ { - yylval.uintval = strtoul(yytext, NULL, 10); + replication_yylval.uintval = strtoul(yytext, NULL, 10); return UCONST; } @@ -138,8 +147,8 @@ WAIT { return K_WAIT; } uint32 hi, lo; if (sscanf(yytext, "%X/%X", &hi, &lo) != 2) - yyerror("invalid streaming start location"); - yylval.recptr = ((uint64) hi) << 32 | lo; + replication_yyerror("invalid streaming start location"); + replication_yylval.recptr = ((uint64) hi) << 32 | lo; return RECPTR; } @@ -151,7 +160,7 @@ WAIT { return K_WAIT; } {quotestop} { yyless(1); BEGIN(INITIAL); - yylval.str = litbufdup(); + replication_yylval.str = litbufdup(); return SCONST; } @@ -173,9 +182,9 @@ WAIT { return K_WAIT; } yyless(1); BEGIN(INITIAL); - yylval.str = litbufdup(); - len = strlen(yylval.str); - truncate_identifier(yylval.str, len, true); + replication_yylval.str = litbufdup(); + len = strlen(replication_yylval.str); + truncate_identifier(replication_yylval.str, len, true); return IDENT; } @@ -186,7 +195,7 @@ WAIT { return K_WAIT; } {identifier} { int len = strlen(yytext); - yylval.str = downcase_truncate_identifier(yytext, len, true); + replication_yylval.str = downcase_truncate_identifier(yytext, len, true); return IDENT; } @@ -195,7 +204,7 @@ WAIT { return K_WAIT; } return yytext[0]; } -<> { yyerror("unterminated quoted string"); } +<> { replication_yyerror("unterminated quoted string"); } <> { @@ -231,7 +240,7 @@ addlitchar(unsigned char ychar) } void -yyerror(const char *message) +replication_yyerror(const char *message) { ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck index ce33ec1f68..917ef29c15 100755 --- a/src/tools/pginclude/headerscheck +++ b/src/tools/pginclude/headerscheck @@ -120,6 +120,7 @@ do test "$f" = src/include/parser/gram.h && continue test "$f" = src/backend/parser/gram.h && continue test "$f" = src/backend/bootstrap/bootparse.h && continue + test "$f" = src/backend/replication/repl_gram.h && continue test "$f" = src/pl/plpgsql/src/pl_gram.h && continue test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue -- 2.36.1