Build all Flex files standalone

The proposed Meson build system will need a way to ignore certain
generated files in order to coexist with the autoconf build system,
and C files generated by Flex which are #include'd into .y files make
this more difficult. In similar vein to 72b1e3a21, arrange for all Flex
C files to compile to their own .o targets.

Reviewed by Andres Freund

Discussion: https://www.postgresql.org/message-id/20220810171935.7k5zgnjwqzalzmtm%40awork3.anarazel.de
Discussion: https://www.postgresql.org/message-id/CAFBsxsF8Gc2StS3haXofshHCzqNMRXiSxvQEYGwnFsTmsdwNeg@mail.gmail.com
This commit is contained in:
John Naylor 2022-09-04 11:33:31 +07:00
parent 80e8450a74
commit dac048f71e
38 changed files with 307 additions and 190 deletions

View File

@ -1,3 +1,4 @@
/cubeparse.h
/cubeparse.c /cubeparse.c
/cubescan.c /cubescan.c
# Generated subdirectories # Generated subdirectories

View File

@ -4,7 +4,8 @@ MODULE_big = cube
OBJS = \ OBJS = \
$(WIN32RES) \ $(WIN32RES) \
cube.o \ cube.o \
cubeparse.o cubeparse.o \
cubescan.o
EXTENSION = cube EXTENSION = cube
DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql cube--1.4--1.5.sql \ DATA = cube--1.2.sql cube--1.2--1.3.sql cube--1.3--1.4.sql cube--1.4--1.5.sql \
@ -15,8 +16,6 @@ HEADERS = cubedata.h
REGRESS = cube cube_sci REGRESS = cube cube_sci
EXTRA_CLEAN = y.tab.c y.tab.h
SHLIB_LINK += $(filter -lm, $(LIBS)) SHLIB_LINK += $(filter -lm, $(LIBS))
ifdef USE_PGXS ifdef USE_PGXS
@ -30,11 +29,16 @@ include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk include $(top_srcdir)/contrib/contrib-global.mk
endif endif
# See notes in src/backend/parser/Makefile about the following two rules
cubeparse.h: cubeparse.c
touch $@
# cubescan is compiled as part of cubeparse cubeparse.c: BISONFLAGS += -d
cubeparse.o: cubescan.c
# Force these dependencies to be known even without dependency info built:
cubeparse.o cubescan.o: cubeparse.h
distprep: cubeparse.c cubescan.c distprep: cubeparse.c cubescan.c
maintainer-clean: maintainer-clean:
rm -f cubeparse.c cubescan.c rm -f cubeparse.h cubeparse.c cubescan.c

View File

@ -119,11 +119,11 @@ cube_in(PG_FUNCTION_ARGS)
{ {
char *str = PG_GETARG_CSTRING(0); char *str = PG_GETARG_CSTRING(0);
NDBOX *result; NDBOX *result;
Size scanbuflen;
cube_scanner_init(str); cube_scanner_init(str, &scanbuflen);
if (cube_yyparse(&result) != 0) cube_yyparse(&result, scanbuflen);
cube_yyerror(&result, "cube parser failed");
cube_scanner_finish(); cube_scanner_finish();

View File

@ -61,9 +61,9 @@ typedef struct NDBOX
/* in cubescan.l */ /* in cubescan.l */
extern int cube_yylex(void); extern int cube_yylex(void);
extern void cube_yyerror(NDBOX **result, const char *message) pg_attribute_noreturn(); extern void cube_yyerror(NDBOX **result, Size scanbuflen, const char *message) pg_attribute_noreturn();
extern void cube_scanner_init(const char *str); extern void cube_scanner_init(const char *str, Size *scanbuflen);
extern void cube_scanner_finish(void); extern void cube_scanner_finish(void);
/* in cubeparse.y */ /* in cubeparse.y */
extern int cube_yyparse(NDBOX **result); extern int cube_yyparse(NDBOX **result, Size scanbuflen);

View File

@ -23,9 +23,6 @@
#define YYMALLOC palloc #define YYMALLOC palloc
#define YYFREE pfree #define YYFREE pfree
static char *scanbuf;
static int scanbuflen;
static int item_count(const char *s, char delim); static int item_count(const char *s, char delim);
static NDBOX *write_box(int dim, char *str1, char *str2); static NDBOX *write_box(int dim, char *str1, char *str2);
static NDBOX *write_point_as_box(int dim, char *str); static NDBOX *write_point_as_box(int dim, char *str);
@ -34,6 +31,7 @@ static NDBOX *write_point_as_box(int dim, char *str);
/* BISON Declarations */ /* BISON Declarations */
%parse-param {NDBOX **result} %parse-param {NDBOX **result}
%parse-param {Size scanbuflen}
%expect 0 %expect 0
%name-prefix="cube_yy" %name-prefix="cube_yy"
@ -265,5 +263,3 @@ write_point_as_box(int dim, char *str)
return bp; return bp;
} }
#include "cubescan.c"

View File

@ -1,9 +1,21 @@
%{ %top{
/* /*
* A scanner for EMP-style numeric ranges * A scanner for EMP-style numeric ranges
* contrib/cube/cubescan.l * contrib/cube/cubescan.l
*/ */
#include "postgres.h"
/*
* NB: include cubeparse.h only AFTER defining YYSTYPE (to match cubeparse.y)
* and cubedata.h for NDBOX.
*/
#include "cubedata.h"
#define YYSTYPE char *
#include "cubeparse.h"
}
%{
/* LCOV_EXCL_START */ /* LCOV_EXCL_START */
/* No reason to constrain amount of data slurped */ /* No reason to constrain amount of data slurped */
@ -21,9 +33,7 @@ fprintf_to_ereport(const char *fmt, const char *msg)
/* Handles to the buffer that the lexer uses internally */ /* Handles to the buffer that the lexer uses internally */
static YY_BUFFER_STATE scanbufhandle; static YY_BUFFER_STATE scanbufhandle;
/* this is now declared in cubeparse.y: */ static char *scanbuf;
/* static char *scanbuf; */
/* static int scanbuflen; */
%} %}
%option 8bit %option 8bit
@ -45,14 +55,14 @@ NaN [nN][aA][nN]
%% %%
{float} yylval = yytext; return CUBEFLOAT; {float} cube_yylval = yytext; return CUBEFLOAT;
{infinity} yylval = yytext; return CUBEFLOAT; {infinity} cube_yylval = yytext; return CUBEFLOAT;
{NaN} yylval = yytext; return CUBEFLOAT; {NaN} cube_yylval = yytext; return CUBEFLOAT;
\[ yylval = "("; return O_BRACKET; \[ cube_yylval = "("; return O_BRACKET;
\] yylval = ")"; return C_BRACKET; \] cube_yylval = ")"; return C_BRACKET;
\( yylval = "("; return O_PAREN; \( cube_yylval = "("; return O_PAREN;
\) yylval = ")"; return C_PAREN; \) cube_yylval = ")"; return C_PAREN;
\, yylval = ","; return COMMA; \, cube_yylval = ","; return COMMA;
[ \t\n\r\f]+ /* discard spaces */ [ \t\n\r\f]+ /* discard spaces */
. return yytext[0]; /* alert parser of the garbage */ . return yytext[0]; /* alert parser of the garbage */
@ -60,9 +70,9 @@ NaN [nN][aA][nN]
/* LCOV_EXCL_STOP */ /* LCOV_EXCL_STOP */
/* result is not used, but Bison expects this signature */ /* result and scanbuflen are not used, but Bison expects this signature */
void void
yyerror(NDBOX **result, const char *message) cube_yyerror(NDBOX **result, Size scanbuflen, const char *message)
{ {
if (*yytext == YY_END_OF_BUFFER_CHAR) if (*yytext == YY_END_OF_BUFFER_CHAR)
{ {
@ -87,9 +97,9 @@ yyerror(NDBOX **result, const char *message)
* Called before any actual parsing is done * Called before any actual parsing is done
*/ */
void void
cube_scanner_init(const char *str) cube_scanner_init(const char *str, Size *scanbuflen)
{ {
Size slen = strlen(str); Size slen = strlen(str);
/* /*
* Might be left over after ereport() * Might be left over after ereport()
@ -100,7 +110,7 @@ cube_scanner_init(const char *str)
/* /*
* Make a scan buffer with special termination needed by flex. * Make a scan buffer with special termination needed by flex.
*/ */
scanbuflen = slen; *scanbuflen = slen;
scanbuf = palloc(slen + 2); scanbuf = palloc(slen + 2);
memcpy(scanbuf, str, slen); memcpy(scanbuf, str, slen);
scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR; scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;

View File

@ -1,3 +1,4 @@
/segparse.h
/segparse.c /segparse.c
/segscan.c /segscan.c
# Generated subdirectories # Generated subdirectories

View File

@ -4,7 +4,8 @@ MODULE_big = seg
OBJS = \ OBJS = \
$(WIN32RES) \ $(WIN32RES) \
seg.o \ seg.o \
segparse.o segparse.o \
segscan.o
EXTENSION = seg EXTENSION = seg
DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql seg--1.3--1.4.sql \ DATA = seg--1.1.sql seg--1.1--1.2.sql seg--1.2--1.3.sql seg--1.3--1.4.sql \
@ -29,10 +30,16 @@ include $(top_srcdir)/contrib/contrib-global.mk
endif endif
# segscan is compiled as part of segparse # See notes in src/backend/parser/Makefile about the following two rules
segparse.o: segscan.c segparse.h: segparse.c
touch $@
segparse.c: BISONFLAGS += -d
# Force these dependencies to be known even without dependency info built:
segparse.o segscan.o: segparse.h
distprep: segparse.c segscan.c distprep: segparse.c segscan.c
maintainer-clean: maintainer-clean:
rm -f segparse.c segscan.c rm -f segparse.h segparse.c segscan.c

View File

@ -160,6 +160,3 @@ seg_atof(const char *value)
datum = DirectFunctionCall1(float4in, CStringGetDatum(value)); datum = DirectFunctionCall1(float4in, CStringGetDatum(value));
return DatumGetFloat4(datum); return DatumGetFloat4(datum);
} }
#include "segscan.c"

View File

@ -1,8 +1,18 @@
%{ %top{
/* /*
* A scanner for EMP-style numeric ranges * A scanner for EMP-style numeric ranges
*/ */
#include "postgres.h"
/*
* NB: include segparse.h only AFTER including segdata.h, because segdata.h
* contains the definition for SEG.
*/
#include "segdata.h"
#include "segparse.h"
}
%{
/* LCOV_EXCL_START */ /* LCOV_EXCL_START */
/* No reason to constrain amount of data slurped */ /* No reason to constrain amount of data slurped */
@ -21,7 +31,6 @@ fprintf_to_ereport(const char *fmt, const char *msg)
/* Handles to the buffer that the lexer uses internally */ /* Handles to the buffer that the lexer uses internally */
static YY_BUFFER_STATE scanbufhandle; static YY_BUFFER_STATE scanbufhandle;
static char *scanbuf; static char *scanbuf;
static int scanbuflen;
%} %}
%option 8bit %option 8bit
@ -42,12 +51,12 @@ float ({integer}|{real})([eE]{integer})?
%% %%
{range} yylval.text = yytext; return RANGE; {range} seg_yylval.text = yytext; return RANGE;
{plumin} yylval.text = yytext; return PLUMIN; {plumin} seg_yylval.text = yytext; return PLUMIN;
{float} yylval.text = yytext; return SEGFLOAT; {float} seg_yylval.text = yytext; return SEGFLOAT;
\< yylval.text = "<"; return EXTENSION; \< seg_yylval.text = "<"; return EXTENSION;
\> yylval.text = ">"; return EXTENSION; \> seg_yylval.text = ">"; return EXTENSION;
\~ yylval.text = "~"; return EXTENSION; \~ seg_yylval.text = "~"; return EXTENSION;
[ \t\n\r\f]+ /* discard spaces */ [ \t\n\r\f]+ /* discard spaces */
. return yytext[0]; /* alert parser of the garbage */ . return yytext[0]; /* alert parser of the garbage */
@ -56,7 +65,7 @@ float ({integer}|{real})([eE]{integer})?
/* LCOV_EXCL_STOP */ /* LCOV_EXCL_STOP */
void void
yyerror(SEG *result, const char *message) seg_yyerror(SEG *result, const char *message)
{ {
if (*yytext == YY_END_OF_BUFFER_CHAR) if (*yytext == YY_END_OF_BUFFER_CHAR)
{ {
@ -94,7 +103,6 @@ seg_scanner_init(const char *str)
/* /*
* Make a scan buffer with special termination needed by flex. * Make a scan buffer with special termination needed by flex.
*/ */
scanbuflen = slen;
scanbuf = palloc(slen + 2); scanbuf = palloc(slen + 2);
memcpy(scanbuf, str, slen); memcpy(scanbuf, str, slen);
scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR; scanbuf[slen] = scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;

View File

@ -174,10 +174,10 @@ utils/probes.o: utils/probes.d $(SUBDIROBJS)
# Be sure that these files get removed by the maintainer-clean target # Be sure that these files get removed by the maintainer-clean target
distprep: distprep:
$(MAKE) -C parser gram.c gram.h scan.c $(MAKE) -C parser gram.c gram.h scan.c
$(MAKE) -C bootstrap bootparse.c bootscanner.c $(MAKE) -C bootstrap bootparse.c bootparse.h bootscanner.c
$(MAKE) -C catalog distprep $(MAKE) -C catalog distprep
$(MAKE) -C nodes 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_gram.h syncrep_scanner.c
$(MAKE) -C storage/lmgr lwlocknames.h lwlocknames.c $(MAKE) -C storage/lmgr lwlocknames.h lwlocknames.c
$(MAKE) -C utils distprep $(MAKE) -C utils distprep
$(MAKE) -C utils/adt jsonpath_gram.c jsonpath_scan.c $(MAKE) -C utils/adt jsonpath_gram.c jsonpath_scan.c
@ -292,13 +292,16 @@ maintainer-clean: distclean
$(MAKE) -C nodes $@ $(MAKE) -C nodes $@
$(MAKE) -C utils $@ $(MAKE) -C utils $@
rm -f bootstrap/bootparse.c \ rm -f bootstrap/bootparse.c \
bootstrap/bootparse.h \
bootstrap/bootscanner.c \ bootstrap/bootscanner.c \
parser/gram.c \ parser/gram.c \
parser/gram.h \ parser/gram.h \
parser/scan.c \ parser/scan.c \
replication/repl_gram.c \ replication/repl_gram.c \
replication/repl_gram.h \
replication/repl_scanner.c \ replication/repl_scanner.c \
replication/syncrep_gram.c \ replication/syncrep_gram.c \
replication/syncrep_gram.h \
replication/syncrep_scanner.c \ replication/syncrep_scanner.c \
storage/lmgr/lwlocknames.c \ storage/lmgr/lwlocknames.c \
storage/lmgr/lwlocknames.h \ storage/lmgr/lwlocknames.h \

View File

@ -1,2 +1,3 @@
/bootparse.h
/bootparse.c /bootparse.c
/bootscanner.c /bootscanner.c

View File

@ -14,12 +14,19 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
OBJS = \ OBJS = \
bootparse.o \ bootparse.o \
bootscanner.o \
bootstrap.o bootstrap.o
include $(top_srcdir)/src/backend/common.mk include $(top_srcdir)/src/backend/common.mk
# bootscanner is compiled as part of bootparse # See notes in src/backend/parser/Makefile about the following two rules
bootparse.o: bootscanner.c bootparse.h: bootparse.c
touch $@
bootparse.c: BISONFLAGS += -d
# Force these dependencies to be known even without dependency info built:
bootparse.o bootscanner.o: bootparse.h
# bootparse.c and bootscanner.c are in the distribution tarball, so # bootparse.c and bootscanner.c are in the distribution tarball, so
# they are not cleaned here. # they are not cleaned here.

View File

@ -488,5 +488,3 @@ boot_ident:
| XNULL { $$ = pstrdup($1); } | XNULL { $$ = pstrdup($1); }
; ;
%% %%
#include "bootscanner.c"

View File

@ -1,4 +1,4 @@
%{ %top{
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* bootscanner.l * bootscanner.l
@ -15,11 +15,17 @@
*/ */
#include "postgres.h" #include "postgres.h"
/*
* NB: include bootparse.h only AFTER including bootstrap.h, because bootstrap.h
* includes node definitions needed for YYSTYPE.
*/
#include "bootstrap/bootstrap.h" #include "bootstrap/bootstrap.h"
#include "bootparse.h"
#include "utils/guc.h" #include "utils/guc.h"
/* Not needed now that this file is compiled as part of bootparse. */ }
/* #include "bootparse.h" */
%{
/* LCOV_EXCL_START */ /* LCOV_EXCL_START */
@ -52,7 +58,7 @@ id [-A-Za-z0-9_]+
sid \'([^']|\'\')*\' sid \'([^']|\'\')*\'
/* /*
* Keyword tokens return the keyword text (as a constant string) in yylval.kw, * Keyword tokens return the keyword text (as a constant string) in boot_yylval.kw,
* just in case that's needed because we want to treat the keyword as an * just in case that's needed because we want to treat the keyword as an
* unreserved identifier. Note that _null_ is not treated as a keyword * unreserved identifier. Note that _null_ is not treated as a keyword
* for this purpose; it's the one "reserved word" in the bootstrap syntax. * for this purpose; it's the one "reserved word" in the bootstrap syntax.
@ -60,23 +66,23 @@ sid \'([^']|\'\')*\'
* Notice that all the keywords are case-sensitive, and for historical * Notice that all the keywords are case-sensitive, and for historical
* reasons some must be upper case. * reasons some must be upper case.
* *
* String tokens return a palloc'd string in yylval.str. * String tokens return a palloc'd string in boot_yylval.str.
*/ */
%% %%
open { yylval.kw = "open"; return OPEN; } open { boot_yylval.kw = "open"; return OPEN; }
close { yylval.kw = "close"; return XCLOSE; } close { boot_yylval.kw = "close"; return XCLOSE; }
create { yylval.kw = "create"; return XCREATE; } create { boot_yylval.kw = "create"; return XCREATE; }
OID { yylval.kw = "OID"; return OBJ_ID; } OID { boot_yylval.kw = "OID"; return OBJ_ID; }
bootstrap { yylval.kw = "bootstrap"; return XBOOTSTRAP; } bootstrap { boot_yylval.kw = "bootstrap"; return XBOOTSTRAP; }
shared_relation { yylval.kw = "shared_relation"; return XSHARED_RELATION; } shared_relation { boot_yylval.kw = "shared_relation"; return XSHARED_RELATION; }
rowtype_oid { yylval.kw = "rowtype_oid"; return XROWTYPE_OID; } rowtype_oid { boot_yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
insert { yylval.kw = "insert"; return INSERT_TUPLE; } insert { boot_yylval.kw = "insert"; return INSERT_TUPLE; }
_null_ { return NULLVAL; } _null_ { return NULLVAL; }
@ -90,25 +96,25 @@ _null_ { return NULLVAL; }
^\#[^\n]* ; /* drop everything after "#" for comments */ ^\#[^\n]* ; /* drop everything after "#" for comments */
declare { yylval.kw = "declare"; return XDECLARE; } declare { boot_yylval.kw = "declare"; return XDECLARE; }
build { yylval.kw = "build"; return XBUILD; } build { boot_yylval.kw = "build"; return XBUILD; }
indices { yylval.kw = "indices"; return INDICES; } indices { boot_yylval.kw = "indices"; return INDICES; }
unique { yylval.kw = "unique"; return UNIQUE; } unique { boot_yylval.kw = "unique"; return UNIQUE; }
index { yylval.kw = "index"; return INDEX; } index { boot_yylval.kw = "index"; return INDEX; }
on { yylval.kw = "on"; return ON; } on { boot_yylval.kw = "on"; return ON; }
using { yylval.kw = "using"; return USING; } using { boot_yylval.kw = "using"; return USING; }
toast { yylval.kw = "toast"; return XTOAST; } toast { boot_yylval.kw = "toast"; return XTOAST; }
FORCE { yylval.kw = "FORCE"; return XFORCE; } FORCE { boot_yylval.kw = "FORCE"; return XFORCE; }
NOT { yylval.kw = "NOT"; return XNOT; } NOT { boot_yylval.kw = "NOT"; return XNOT; }
NULL { yylval.kw = "NULL"; return XNULL; } NULL { boot_yylval.kw = "NULL"; return XNULL; }
{id} { {id} {
yylval.str = pstrdup(yytext); boot_yylval.str = pstrdup(yytext);
return ID; return ID;
} }
{sid} { {sid} {
/* strip quotes and escapes */ /* strip quotes and escapes */
yylval.str = DeescapeQuotedString(yytext); boot_yylval.str = DeescapeQuotedString(yytext);
return ID; return ID;
} }
@ -121,7 +127,7 @@ NULL { yylval.kw = "NULL"; return XNULL; }
/* LCOV_EXCL_STOP */ /* LCOV_EXCL_STOP */
void void
yyerror(const char *message) boot_yyerror(const char *message)
{ {
elog(ERROR, "%s at line %d", message, yyline); elog(ERROR, "%s at line %d", message, yyline);
} }

View File

@ -1,4 +1,6 @@
/repl_gram.h
/repl_gram.c /repl_gram.c
/repl_scanner.c /repl_scanner.c
/syncrep_gram.h
/syncrep_gram.c /syncrep_gram.c
/syncrep_scanner.c /syncrep_scanner.c

View File

@ -16,10 +16,12 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
OBJS = \ OBJS = \
repl_gram.o \ repl_gram.o \
repl_scanner.o \
slot.o \ slot.o \
slotfuncs.o \ slotfuncs.o \
syncrep.o \ syncrep.o \
syncrep_gram.o \ syncrep_gram.o \
syncrep_scanner.o \
walreceiver.o \ walreceiver.o \
walreceiverfuncs.o \ walreceiverfuncs.o \
walsender.o walsender.o
@ -28,11 +30,23 @@ SUBDIRS = logical
include $(top_srcdir)/src/backend/common.mk include $(top_srcdir)/src/backend/common.mk
# repl_scanner is compiled as part of repl_gram # See notes in src/backend/parser/Makefile about the following two rules
repl_gram.o: repl_scanner.c repl_gram.h: repl_gram.c
touch $@
# syncrep_scanner is compiled as part of syncrep_gram repl_gram.c: BISONFLAGS += -d
syncrep_gram.o: syncrep_scanner.c
# Force these dependencies to be known even without dependency info built:
repl_gram.o repl_scanner.o: repl_gram.h
# See notes in src/backend/parser/Makefile about the following two rules
syncrep_gram.h: syncrep_gram.c
touch $@
syncrep_gram.c: BISONFLAGS += -d
# Force these dependencies to be known even without dependency info built:
syncrep_gram.o syncrep_scanner.o: syncrep_gram.h
# repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c # repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c
# are in the distribution tarball, so they are not cleaned here. # are in the distribution tarball, so they are not cleaned here.

View File

@ -416,5 +416,3 @@ ident_or_keyword:
; ;
%% %%
#include "repl_scanner.c"

View File

@ -1,4 +1,4 @@
%{ %top{
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* repl_scanner.l * repl_scanner.l
@ -18,6 +18,15 @@
#include "utils/builtins.h" #include "utils/builtins.h"
#include "parser/scansup.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) */ /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
#undef fprintf #undef fprintf
#define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg) #define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)
@ -130,7 +139,7 @@ WAIT { return K_WAIT; }
{space}+ { /* do nothing */ } {space}+ { /* do nothing */ }
{digit}+ { {digit}+ {
yylval.uintval = strtoul(yytext, NULL, 10); replication_yylval.uintval = strtoul(yytext, NULL, 10);
return UCONST; return UCONST;
} }
@ -138,8 +147,8 @@ WAIT { return K_WAIT; }
uint32 hi, uint32 hi,
lo; lo;
if (sscanf(yytext, "%X/%X", &hi, &lo) != 2) if (sscanf(yytext, "%X/%X", &hi, &lo) != 2)
yyerror("invalid streaming start location"); replication_yyerror("invalid streaming start location");
yylval.recptr = ((uint64) hi) << 32 | lo; replication_yylval.recptr = ((uint64) hi) << 32 | lo;
return RECPTR; return RECPTR;
} }
@ -151,7 +160,7 @@ WAIT { return K_WAIT; }
<xq>{quotestop} { <xq>{quotestop} {
yyless(1); yyless(1);
BEGIN(INITIAL); BEGIN(INITIAL);
yylval.str = litbufdup(); replication_yylval.str = litbufdup();
return SCONST; return SCONST;
} }
@ -173,9 +182,9 @@ WAIT { return K_WAIT; }
yyless(1); yyless(1);
BEGIN(INITIAL); BEGIN(INITIAL);
yylval.str = litbufdup(); replication_yylval.str = litbufdup();
len = strlen(yylval.str); len = strlen(replication_yylval.str);
truncate_identifier(yylval.str, len, true); truncate_identifier(replication_yylval.str, len, true);
return IDENT; return IDENT;
} }
@ -186,7 +195,7 @@ WAIT { return K_WAIT; }
{identifier} { {identifier} {
int len = strlen(yytext); int len = strlen(yytext);
yylval.str = downcase_truncate_identifier(yytext, len, true); replication_yylval.str = downcase_truncate_identifier(yytext, len, true);
return IDENT; return IDENT;
} }
@ -195,7 +204,7 @@ WAIT { return K_WAIT; }
return yytext[0]; return yytext[0];
} }
<xq,xd><<EOF>> { yyerror("unterminated quoted string"); } <xq,xd><<EOF>> { replication_yyerror("unterminated quoted string"); }
<<EOF>> { <<EOF>> {
@ -231,7 +240,7 @@ addlitchar(unsigned char ychar)
} }
void void
yyerror(const char *message) replication_yyerror(const char *message)
{ {
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_SYNTAX_ERROR),

View File

@ -112,5 +112,3 @@ create_syncrep_config(const char *num_sync, List *members, uint8 syncrep_method)
return config; return config;
} }
#include "syncrep_scanner.c"

View File

@ -1,4 +1,4 @@
%{ %top{
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* syncrep_scanner.l * syncrep_scanner.l
@ -17,6 +17,15 @@
#include "lib/stringinfo.h" #include "lib/stringinfo.h"
/*
* NB: include syncrep_gram.h only AFTER including syncrep.h, because syncrep.h
* includes node definitions needed for YYSTYPE.
*/
#include "replication/syncrep.h"
#include "syncrep_gram.h"
}
%{
/* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */ /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */
#undef fprintf #undef fprintf
#define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg) #define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)
@ -82,28 +91,28 @@ xdinside [^"]+
appendStringInfoString(&xdbuf, yytext); appendStringInfoString(&xdbuf, yytext);
} }
<xd>{xdstop} { <xd>{xdstop} {
yylval.str = xdbuf.data; syncrep_yylval.str = xdbuf.data;
xdbuf.data = NULL; xdbuf.data = NULL;
BEGIN(INITIAL); BEGIN(INITIAL);
return NAME; return NAME;
} }
<xd><<EOF>> { <xd><<EOF>> {
yyerror("unterminated quoted identifier"); syncrep_yyerror("unterminated quoted identifier");
return JUNK; return JUNK;
} }
{identifier} { {identifier} {
yylval.str = pstrdup(yytext); syncrep_yylval.str = pstrdup(yytext);
return NAME; return NAME;
} }
{digit}+ { {digit}+ {
yylval.str = pstrdup(yytext); syncrep_yylval.str = pstrdup(yytext);
return NUM; return NUM;
} }
"*" { "*" {
yylval.str = "*"; syncrep_yylval.str = "*";
return NAME; return NAME;
} }

View File

@ -1,2 +1,3 @@
/jsonpath_gram.h
/jsonpath_gram.c /jsonpath_gram.c
/jsonpath_scan.c /jsonpath_scan.c

View File

@ -57,6 +57,7 @@ OBJS = \
jsonpath.o \ jsonpath.o \
jsonpath_exec.o \ jsonpath_exec.o \
jsonpath_gram.o \ jsonpath_gram.o \
jsonpath_scan.o \
like.o \ like.o \
like_support.o \ like_support.o \
lockfuncs.o \ lockfuncs.o \
@ -119,11 +120,17 @@ OBJS = \
xid8funcs.o \ xid8funcs.o \
xml.o xml.o
# See notes in src/backend/parser/Makefile about the following two rules
jsonpath_gram.h: jsonpath_gram.c
touch $@
jsonpath_gram.c: BISONFLAGS += -d
jsonpath_scan.c: FLEXFLAGS = -CF -p -p jsonpath_scan.c: FLEXFLAGS = -CF -p -p
jsonpath_scan.c: FLEX_NO_BACKUP=yes jsonpath_scan.c: FLEX_NO_BACKUP=yes
# jsonpath_scan is compiled as part of jsonpath_gram # Force these dependencies to be known even without dependency info built:
jsonpath_gram.o: jsonpath_scan.c jsonpath_gram.o jsonpath_scan.o: jsonpath_gram.h
# jsonpath_gram.c and jsonpath_scan.c are in the distribution tarball, # jsonpath_gram.c and jsonpath_scan.c are in the distribution tarball,
# so they are not cleaned here. # so they are not cleaned here.

View File

@ -18,26 +18,11 @@
#include "catalog/pg_collation.h" #include "catalog/pg_collation.h"
#include "fmgr.h" #include "fmgr.h"
#include "jsonpath_internal.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "nodes/pg_list.h" #include "nodes/pg_list.h"
#include "regex/regex.h" #include "regex/regex.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/jsonpath.h"
/* struct JsonPathString is shared between scan and gram */
typedef struct JsonPathString
{
char *val;
int len;
int total;
} JsonPathString;
union YYSTYPE;
/* flex 2.5.4 doesn't bother with a decl for this */
int jsonpath_yylex(union YYSTYPE *yylval_param);
int jsonpath_yyparse(JsonPathParseResult **result);
void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
static JsonPathParseItem *makeItemType(JsonPathItemType type); static JsonPathParseItem *makeItemType(JsonPathItemType type);
static JsonPathParseItem *makeItemString(JsonPathString *s); static JsonPathParseItem *makeItemString(JsonPathString *s);
@ -593,13 +578,3 @@ jspConvertRegexFlags(uint32 xflags)
return cflags; return cflags;
} }
/*
* jsonpath_scan.l is compiled as part of jsonpath_gram.y. Currently, this is
* unavoidable because jsonpath_gram does not create a .h file to export its
* token symbols. If these files ever grow large enough to be worth compiling
* separately, that could be fixed; but for now it seems like useless
* complication.
*/
#include "jsonpath_scan.c"

View File

@ -0,0 +1,32 @@
/*-------------------------------------------------------------------------
*
* jsonpath_internal.h
* Private definitions for jsonpath scanner & parser
*
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/backend/utils/adt/jsonpath_internal.h
*
*-------------------------------------------------------------------------
*/
#ifndef JSONPATH_INTERNAL_H
#define JSONPATH_INTERNAL_H
/* struct JsonPathString is shared between scan and gram */
typedef struct JsonPathString
{
char *val;
int len;
int total;
} JsonPathString;
#include "utils/jsonpath.h"
#include "jsonpath_gram.h"
extern int jsonpath_yylex(YYSTYPE *yylval_param);
extern int jsonpath_yyparse(JsonPathParseResult **result);
extern void jsonpath_yyerror(JsonPathParseResult **result, const char *message);
#endif /* JSONPATH_INTERNAL_H */

View File

@ -1,4 +1,4 @@
%{ %top{
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* jsonpath_scan.l * jsonpath_scan.l
@ -17,9 +17,18 @@
#include "postgres.h" #include "postgres.h"
/*
* NB: include jsonpath_gram.h only AFTER including jsonpath_internal.h,
* because jsonpath_internal.h contains the declaration for JsonPathString.
*/
#include "jsonpath_internal.h"
#include "jsonpath_gram.h"
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
#include "nodes/pg_list.h" #include "nodes/pg_list.h"
}
%{
static JsonPathString scanstring; static JsonPathString scanstring;
/* Handles to the buffer that the lexer uses internally */ /* Handles to the buffer that the lexer uses internally */
@ -142,9 +151,9 @@ hex_fail \\x{hex_dig}{0,1}
<xnq,xq,xvq>{hex_char} { parseHexChar(yytext); } <xnq,xq,xvq>{hex_char} { parseHexChar(yytext); }
<xnq,xq,xvq>{unicode}*{unicodefail} { yyerror(NULL, "invalid unicode sequence"); } <xnq,xq,xvq>{unicode}*{unicodefail} { jsonpath_yyerror(NULL, "invalid unicode sequence"); }
<xnq,xq,xvq>{hex_fail} { yyerror(NULL, "invalid hex character sequence"); } <xnq,xq,xvq>{hex_fail} { jsonpath_yyerror(NULL, "invalid hex character sequence"); }
<xnq,xq,xvq>{unicode}+\\ { <xnq,xq,xvq>{unicode}+\\ {
/* throw back the \\, and treat as unicode */ /* throw back the \\, and treat as unicode */
@ -154,9 +163,9 @@ hex_fail \\x{hex_dig}{0,1}
<xnq,xq,xvq>\\. { addchar(false, yytext[1]); } <xnq,xq,xvq>\\. { addchar(false, yytext[1]); }
<xnq,xq,xvq>\\ { yyerror(NULL, "unexpected end after backslash"); } <xnq,xq,xvq>\\ { jsonpath_yyerror(NULL, "unexpected end after backslash"); }
<xq,xvq><<EOF>> { yyerror(NULL, "unexpected end of quoted string"); } <xq,xvq><<EOF>> { jsonpath_yyerror(NULL, "unexpected end of quoted string"); }
<xq>\" { <xq>\" {
yylval->str = scanstring; yylval->str = scanstring;
@ -178,7 +187,7 @@ hex_fail \\x{hex_dig}{0,1}
<xc>\* { } <xc>\* { }
<xc><<EOF>> { yyerror(NULL, "unexpected end of comment"); } <xc><<EOF>> { jsonpath_yyerror(NULL, "unexpected end of comment"); }
\&\& { return AND_P; } \&\& { return AND_P; }
@ -244,10 +253,10 @@ hex_fail \\x{hex_dig}{0,1}
return INT_P; return INT_P;
} }
{realfail} { yyerror(NULL, "invalid numeric literal"); } {realfail} { jsonpath_yyerror(NULL, "invalid numeric literal"); }
{integer_junk} { yyerror(NULL, "trailing junk after numeric literal"); } {integer_junk} { jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
{decimal_junk} { yyerror(NULL, "trailing junk after numeric literal"); } {decimal_junk} { jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
{real_junk} { yyerror(NULL, "trailing junk after numeric literal"); } {real_junk} { jsonpath_yyerror(NULL, "trailing junk after numeric literal"); }
\" { \" {
addchar(true, '\0'); addchar(true, '\0');

View File

@ -16,6 +16,7 @@ override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS)
OBJS = \ OBJS = \
guc.o \ guc.o \
guc-file.o \
help_config.o \ help_config.o \
pg_config.o \ pg_config.o \
pg_controldata.o \ pg_controldata.o \
@ -37,10 +38,6 @@ endif
include $(top_srcdir)/src/backend/common.mk include $(top_srcdir)/src/backend/common.mk
# guc-file is compiled as part of guc
guc.o: guc-file.c
# Note: guc-file.c is not deleted by 'make clean', # Note: guc-file.c is not deleted by 'make clean',
# since we want to ship it in distribution tarballs. # since we want to ship it in distribution tarballs.
clean: clean:
@rm -f lex.yy.c

View File

@ -1,4 +1,4 @@
/* -*-pgsql-c-*- */ %top{
/* /*
* Scanner for the configuration file * Scanner for the configuration file
* *
@ -7,8 +7,6 @@
* src/backend/utils/misc/guc-file.l * src/backend/utils/misc/guc-file.l
*/ */
%{
#include "postgres.h" #include "postgres.h"
#include <ctype.h> #include <ctype.h>
@ -19,8 +17,12 @@
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "storage/fd.h" #include "storage/fd.h"
#include <sys/stat.h>
#include "utils/memutils.h"
}
%{
/* /*
* flex emits a yy_fatal_error() function that it calls in response to * flex emits a yy_fatal_error() function that it calls in response to
* critical errors like malloc failure, file I/O errors, and detection of * critical errors like malloc failure, file I/O errors, and detection of

View File

@ -13333,5 +13333,3 @@ check_default_with_oids(bool *newval, void **extra, GucSource source)
return true; return true;
} }
#include "guc-file.c"

View File

@ -1,3 +1,4 @@
/exprparse.h
/exprparse.c /exprparse.c
/exprscan.c /exprscan.c
/pgbench /pgbench

View File

@ -10,6 +10,7 @@ include $(top_builddir)/src/Makefile.global
OBJS = \ OBJS = \
$(WIN32RES) \ $(WIN32RES) \
exprparse.o \ exprparse.o \
exprscan.o \
pgbench.o pgbench.o
override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS) override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) $(CPPFLAGS)
@ -26,8 +27,14 @@ all: pgbench
pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils pgbench: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
# exprscan is compiled as part of exprparse # See notes in src/backend/parser/Makefile about the following two rules
exprparse.o: exprscan.c exprparse.h: exprparse.c
touch $@
exprparse.c: BISONFLAGS += -d
# Force these dependencies to be known even without dependency info built:
exprparse.o exprscan.o: exprparse.h
distprep: exprparse.c exprscan.c distprep: exprparse.c exprscan.c
@ -45,7 +52,7 @@ clean distclean:
rm -rf tmp_check rm -rf tmp_check
maintainer-clean: distclean maintainer-clean: distclean
rm -f exprparse.c exprscan.c rm -f exprparse.h exprparse.c exprscan.c
check: check:
$(prove_check) $(prove_check)

View File

@ -526,18 +526,3 @@ make_case(yyscan_t yyscanner, PgBenchExprList *when_then_list, PgBenchExpr *else
find_func(yyscanner, "!case_end"), find_func(yyscanner, "!case_end"),
make_elist(else_part, when_then_list)); make_elist(else_part, when_then_list));
} }
/*
* exprscan.l is compiled as part of exprparse.y. Currently, this is
* unavoidable because exprparse does not create a .h file to export
* its token symbols. If these files ever grow large enough to be
* worth compiling separately, that could be fixed; but for now it
* seems like useless complication.
*/
/* First, get rid of "#define yyscan_t" from pgbench.h */
#undef yyscan_t
/* ... and the yylval macro, which flex will have its own definition for */
#undef yylval
#include "exprscan.c"

View File

@ -1,4 +1,4 @@
%{ %top{
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* exprscan.l * exprscan.l
@ -22,9 +22,19 @@
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres_fe.h"
/*
* NB: include exprparse.h only AFTER including pgbench.h, because pgbench.h
* contains definitions needed for YYSTYPE. Likewise, pgbench.h must come after
* psqlscan_int.h for yyscan_t.
*/
#include "fe_utils/psqlscan_int.h" #include "fe_utils/psqlscan_int.h"
#include "pgbench.h"
#include "exprparse.h"
}
%{
/* context information for reporting errors in expressions */ /* context information for reporting errors in expressions */
static const char *expr_source = NULL; static const char *expr_source = NULL;
static int expr_lineno = 0; static int expr_lineno = 0;

View File

@ -3,6 +3,7 @@
/pg_isolation_regress /pg_isolation_regress
# Local generated source files # Local generated source files
/specparse.h
/specparse.c /specparse.c
/specscanner.c /specscanner.c

View File

@ -15,7 +15,8 @@ override CPPFLAGS := -I. -I$(srcdir) -I$(libpq_srcdir) \
OBJS = \ OBJS = \
$(WIN32RES) \ $(WIN32RES) \
isolationtester.o \ isolationtester.o \
specparse.o specparse.o \
specscanner.o
all: isolationtester$(X) pg_isolation_regress$(X) all: isolationtester$(X) pg_isolation_regress$(X)
@ -44,8 +45,14 @@ isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport
distprep: specparse.c specscanner.c distprep: specparse.c specscanner.c
# specscanner is compiled as part of specparse # See notes in src/backend/parser/Makefile about the following two rules
specparse.o: specscanner.c specparse.h: specparse.c
touch $@
specparse.c: BISONFLAGS += -d
# Force these dependencies to be known even without dependency info built:
specparse.o specscanner.o: specparse.h
# specparse.c and specscanner.c are in the distribution tarball, # specparse.c and specscanner.c are in the distribution tarball,
# so do not clean them here # so do not clean them here
@ -55,7 +62,7 @@ clean distclean:
rm -rf $(pg_regress_clean_files) rm -rf $(pg_regress_clean_files)
maintainer-clean: distclean maintainer-clean: distclean
rm -f specparse.c specscanner.c rm -f specparse.h specparse.c specscanner.c
installcheck: all installcheck: all
$(pg_isolation_regress_installcheck) --schedule=$(srcdir)/isolation_schedule $(pg_isolation_regress_installcheck) --schedule=$(srcdir)/isolation_schedule

View File

@ -276,5 +276,3 @@ blocker:
; ;
%% %%
#include "specscanner.c"

View File

@ -1,4 +1,4 @@
%{ %top{
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
* *
* specscanner.l * specscanner.l
@ -9,7 +9,17 @@
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
#include "postgres_fe.h"
/*
* NB: include specparse.h only AFTER including isolationtester.h, because
* isolationtester.h includes node definitions needed for YYSTYPE.
*/
#include "isolationtester.h"
#include "specparse.h"
}
%{
static int yyline = 1; /* line number for error reporting */ static int yyline = 1; /* line number for error reporting */
#define LITBUF_INIT 1024 /* initial size of litbuf */ #define LITBUF_INIT 1024 /* initial size of litbuf */
@ -75,7 +85,7 @@ teardown { return TEARDOWN; }
/* Plain identifiers */ /* Plain identifiers */
{identifier} { {identifier} {
yylval.str = pg_strdup(yytext); spec_yylval.str = pg_strdup(yytext);
return(identifier); return(identifier);
} }
@ -87,13 +97,13 @@ teardown { return TEARDOWN; }
<qident>\"\" { addlitchar(yytext[0]); } <qident>\"\" { addlitchar(yytext[0]); }
<qident>\" { <qident>\" {
litbuf[litbufpos] = '\0'; litbuf[litbufpos] = '\0';
yylval.str = pg_strdup(litbuf); spec_yylval.str = pg_strdup(litbuf);
BEGIN(INITIAL); BEGIN(INITIAL);
return(identifier); return(identifier);
} }
<qident>. { addlitchar(yytext[0]); } <qident>. { addlitchar(yytext[0]); }
<qident>\n { yyerror("unexpected newline in quoted identifier"); } <qident>\n { spec_yyerror("unexpected newline in quoted identifier"); }
<qident><<EOF>> { yyerror("unterminated quoted identifier"); } <qident><<EOF>> { spec_yyerror("unterminated quoted identifier"); }
/* SQL blocks: { UPDATE ... } */ /* SQL blocks: { UPDATE ... } */
/* We trim leading/trailing whitespace, otherwise they're unprocessed */ /* We trim leading/trailing whitespace, otherwise they're unprocessed */
@ -104,7 +114,7 @@ teardown { return TEARDOWN; }
} }
<sql>{space}*"}" { <sql>{space}*"}" {
litbuf[litbufpos] = '\0'; litbuf[litbufpos] = '\0';
yylval.str = pg_strdup(litbuf); spec_yylval.str = pg_strdup(litbuf);
BEGIN(INITIAL); BEGIN(INITIAL);
return(sqlblock); return(sqlblock);
} }
@ -116,12 +126,12 @@ teardown { return TEARDOWN; }
addlitchar(yytext[0]); addlitchar(yytext[0]);
} }
<sql><<EOF>> { <sql><<EOF>> {
yyerror("unterminated sql block"); spec_yyerror("unterminated sql block");
} }
/* Numbers and punctuation */ /* Numbers and punctuation */
{digit}+ { {digit}+ {
yylval.integer = atoi(yytext); spec_yylval.integer = atoi(yytext);
return INTEGER; return INTEGER;
} }
@ -150,7 +160,7 @@ addlitchar(char c)
} }
void void
yyerror(const char *message) spec_yyerror(const char *message)
{ {
fprintf(stderr, "%s at line %d\n", message, yyline); fprintf(stderr, "%s at line %d\n", message, yyline);
exit(1); exit(1);

View File

@ -117,10 +117,18 @@ do
# We can't make these Bison output files compilable standalone # We can't make these Bison output files compilable standalone
# without using "%code require", which old Bison versions lack. # without using "%code require", which old Bison versions lack.
# parser/gram.h will be included by parser/gramparse.h anyway. # parser/gram.h will be included by parser/gramparse.h anyway.
test "$f" = contrib/cube/cubeparse.h && continue
test "$f" = contrib/seg/segparse.h && continue
test "$f" = src/backend/bootstrap/bootparse.h && continue
test "$f" = src/include/parser/gram.h && continue test "$f" = src/include/parser/gram.h && continue
test "$f" = src/backend/parser/gram.h && continue test "$f" = src/backend/parser/gram.h && continue
test "$f" = src/backend/replication/repl_gram.h && continue
test "$f" = src/backend/replication/syncrep_gram.h && continue
test "$f" = src/backend/utils/adt/jsonpath_gram.h && continue
test "$f" = src/bin/pgbench/exprparse.h && continue
test "$f" = src/pl/plpgsql/src/pl_gram.h && continue test "$f" = src/pl/plpgsql/src/pl_gram.h && continue
test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue
test "$f" = src/test/isolation/specparse.h && continue
# This produces a "no previous prototype" warning. # This produces a "no previous prototype" warning.
test "$f" = src/include/storage/checksum_impl.h && continue test "$f" = src/include/storage/checksum_impl.h && continue