From e38e77bd77c803acfc66de8c76798d9d7be67c42 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Sat, 13 Aug 2022 11:18:06 +0700 Subject: [PATCH v3 09/11] Build cubescan.c standalone --- contrib/cube/.gitignore | 1 + contrib/cube/Makefile | 16 +++++++++----- contrib/cube/cubedata.h | 1 + contrib/cube/cubeparse.y | 10 +++------ contrib/cube/cubescan.l | 38 ++++++++++++++++++++------------ src/tools/pginclude/headerscheck | 1 + 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/contrib/cube/.gitignore b/contrib/cube/.gitignore index cb4c989fff..f788440c79 100644 --- a/contrib/cube/.gitignore +++ b/contrib/cube/.gitignore @@ -1,3 +1,4 @@ +/cubeparse.h /cubeparse.c /cubescan.c # Generated subdirectories diff --git a/contrib/cube/Makefile b/contrib/cube/Makefile index cf195506c7..4fd19aac35 100644 --- a/contrib/cube/Makefile +++ b/contrib/cube/Makefile @@ -4,7 +4,8 @@ MODULE_big = cube OBJS = \ $(WIN32RES) \ cube.o \ - cubeparse.o + cubeparse.o \ + cubescan.o 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 \ @@ -15,8 +16,6 @@ HEADERS = cubedata.h REGRESS = cube cube_sci -EXTRA_CLEAN = y.tab.c y.tab.h - SHLIB_LINK += $(filter -lm, $(LIBS)) ifdef USE_PGXS @@ -30,11 +29,16 @@ include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif +# See notes in src/backend/parser/Makefile about the following two rules +cubeparse.h: cubeparse.c + touch $@ + +cubeparse.c: BISONFLAGS += -d -# cubescan is compiled as part of cubeparse -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 maintainer-clean: - rm -f cubeparse.c cubescan.c + rm -f cubeparse.h cubeparse.c cubescan.c diff --git a/contrib/cube/cubedata.h b/contrib/cube/cubedata.h index dbe7d4f742..a04fc504ad 100644 --- a/contrib/cube/cubedata.h +++ b/contrib/cube/cubedata.h @@ -67,3 +67,4 @@ extern void cube_scanner_finish(void); /* in cubeparse.y */ extern int cube_yyparse(NDBOX **result); +extern int scanbuflen; diff --git a/contrib/cube/cubeparse.y b/contrib/cube/cubeparse.y index 7577c4515c..8e210b49ec 100644 --- a/contrib/cube/cubeparse.y +++ b/contrib/cube/cubeparse.y @@ -7,11 +7,9 @@ #include "postgres.h" #include "cubedata.h" +#include "cube_internal.h" #include "utils/float.h" -/* All grammar constructs return strings */ -#define YYSTYPE char * - /* * Bison doesn't allocate anything that needs to live across parser calls, * so we can easily have it use palloc instead of malloc. This prevents @@ -23,8 +21,8 @@ #define YYMALLOC palloc #define YYFREE pfree -static char *scanbuf; -static int scanbuflen; +/* TODO: get rid of global variable */ +int scanbuflen; static int item_count(const char *s, char delim); static NDBOX *write_box(int dim, char *str1, char *str2); @@ -265,5 +263,3 @@ write_point_as_box(int dim, char *str) return bp; } - -#include "cubescan.c" diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l index bd400e3684..569a4e992e 100644 --- a/contrib/cube/cubescan.l +++ b/contrib/cube/cubescan.l @@ -1,9 +1,21 @@ -%{ +%top{ /* * A scanner for EMP-style numeric ranges * contrib/cube/cubescan.l */ +#include "postgres.h" + +/* + * NB: include cubeparse.h only AFTER including cube_internal.h for YYSTYPE + * and cubedata.h for NDBOX. + */ +#include "cubedata.h" +#include "cube_internal.h" +#include "cubeparse.h" +} + +%{ /* LCOV_EXCL_START */ /* 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 */ static YY_BUFFER_STATE scanbufhandle; -/* this is now declared in cubeparse.y: */ -/* static char *scanbuf; */ -/* static int scanbuflen; */ +static char *scanbuf; %} %option 8bit @@ -45,14 +55,14 @@ NaN [nN][aA][nN] %% -{float} yylval = yytext; return CUBEFLOAT; -{infinity} yylval = yytext; return CUBEFLOAT; -{NaN} yylval = yytext; return CUBEFLOAT; -\[ yylval = "("; return O_BRACKET; -\] yylval = ")"; return C_BRACKET; -\( yylval = "("; return O_PAREN; -\) yylval = ")"; return C_PAREN; -\, yylval = ","; return COMMA; +{float} cube_yylval = yytext; return CUBEFLOAT; +{infinity} cube_yylval = yytext; return CUBEFLOAT; +{NaN} cube_yylval = yytext; return CUBEFLOAT; +\[ cube_yylval = "("; return O_BRACKET; +\] cube_yylval = ")"; return C_BRACKET; +\( cube_yylval = "("; return O_PAREN; +\) cube_yylval = ")"; return C_PAREN; +\, cube_yylval = ","; return COMMA; [ \t\n\r\f]+ /* discard spaces */ . return yytext[0]; /* alert parser of the garbage */ @@ -62,7 +72,7 @@ NaN [nN][aA][nN] /* result is not used, but Bison expects this signature */ void -yyerror(NDBOX **result, const char *message) +cube_yyerror(NDBOX **result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) { @@ -89,7 +99,7 @@ yyerror(NDBOX **result, const char *message) void cube_scanner_init(const char *str) { - Size slen = strlen(str); + Size slen = strlen(str); /* * Might be left over after ereport() diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck index e2c4ba9ae4..a778067570 100755 --- a/src/tools/pginclude/headerscheck +++ b/src/tools/pginclude/headerscheck @@ -115,6 +115,7 @@ do # We can't make these Bison output files compilable standalone # without using "%code require", which old Bison versions lack. # parser/gram.h will be included by parser/gramparse.h anyway. + test "$f" = contrib/cube/cubeparse.h && continue test "$f" = src/include/parser/gram.h && continue test "$f" = src/backend/parser/gram.h && continue test "$f" = src/backend/bootstrap/bootparse.h && continue -- 2.36.1