v3-0009-Build-cubescan.c-standalone.patch
text/x-patch
Filename: v3-0009-Build-cubescan.c-standalone.patch
Type: text/x-patch
Part: 8
Patch
Format: format-patch
Series: patch v3-0009
Subject: Build cubescan.c standalone
| File | + | − |
|---|---|---|
| contrib/cube/cubedata.h | 1 | 0 |
| contrib/cube/cubeparse.y | 3 | 7 |
| contrib/cube/cubescan.l | 24 | 14 |
| contrib/cube/.gitignore | 1 | 0 |
| contrib/cube/Makefile | 10 | 6 |
| src/tools/pginclude/headerscheck | 1 | 0 |
From e38e77bd77c803acfc66de8c76798d9d7be67c42 Mon Sep 17 00:00:00 2001
From: John Naylor <john.naylor@postgresql.org>
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