aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/bootstrap/bootparse.y9
-rw-r--r--src/backend/bootstrap/bootscanner.l91
-rw-r--r--src/backend/bootstrap/bootstrap.c6
-rw-r--r--src/include/bootstrap/bootstrap.h12
4 files changed, 80 insertions, 38 deletions
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index 73a7592fb71..05ef26c07d0 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -34,10 +34,6 @@
#include "bootparse.h"
-/* silence -Wmissing-variable-declarations */
-extern int boot_yychar;
-extern int boot_yynerrs;
-
/*
* Bison doesn't allocate anything that needs to live across parser calls,
@@ -81,6 +77,9 @@ static int num_columns_read = 0;
%}
+%parse-param {yyscan_t yyscanner}
+%lex-param {yyscan_t yyscanner}
+%pure-parser
%expect 0
%name-prefix="boot_yy"
@@ -141,6 +140,8 @@ Boot_OpenStmt:
do_start();
boot_openrel($2);
do_end();
+
+ (void) yynerrs; /* suppress compiler warning */
}
;
diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l
index 31d63ff3015..ad33b4e3fd8 100644
--- a/src/backend/bootstrap/bootscanner.l
+++ b/src/backend/bootstrap/bootscanner.l
@@ -39,17 +39,19 @@ fprintf_to_ereport(const char *fmt, const char *msg)
ereport(ERROR, (errmsg_internal("%s", msg)));
}
-
-static int yyline = 1; /* line number for error reporting */
-
%}
+%option reentrant
+%option bison-bridge
%option 8bit
%option never-interactive
%option nodefault
%option noinput
%option nounput
%option noyywrap
+%option noyyalloc
+%option noyyrealloc
+%option noyyfree
%option warn
%option prefix="boot_yy"
@@ -58,7 +60,7 @@ id [-A-Za-z0-9_]+
sid \'([^']|\'\')*\'
/*
- * Keyword tokens return the keyword text (as a constant string) in boot_yylval.kw,
+ * Keyword tokens return the keyword text (as a constant string) in yylval->kw,
* 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
* for this purpose; it's the one "reserved word" in the bootstrap syntax.
@@ -66,23 +68,23 @@ sid \'([^']|\'\')*\'
* Notice that all the keywords are case-sensitive, and for historical
* reasons some must be upper case.
*
- * String tokens return a palloc'd string in boot_yylval.str.
+ * String tokens return a palloc'd string in yylval->str.
*/
%%
-open { boot_yylval.kw = "open"; return OPEN; }
+open { yylval->kw = "open"; return OPEN; }
-close { boot_yylval.kw = "close"; return XCLOSE; }
+close { yylval->kw = "close"; return XCLOSE; }
-create { boot_yylval.kw = "create"; return XCREATE; }
+create { yylval->kw = "create"; return XCREATE; }
-OID { boot_yylval.kw = "OID"; return OBJ_ID; }
-bootstrap { boot_yylval.kw = "bootstrap"; return XBOOTSTRAP; }
-shared_relation { boot_yylval.kw = "shared_relation"; return XSHARED_RELATION; }
-rowtype_oid { boot_yylval.kw = "rowtype_oid"; return XROWTYPE_OID; }
+OID { yylval->kw = "OID"; return OBJ_ID; }
+bootstrap { yylval->kw = "bootstrap"; return XBOOTSTRAP; }
+shared_relation { yylval->kw = "shared_relation"; return XSHARED_RELATION; }
+rowtype_oid { yylval->kw = "rowtype_oid"; return XROWTYPE_OID; }
-insert { boot_yylval.kw = "insert"; return INSERT_TUPLE; }
+insert { yylval->kw = "insert"; return INSERT_TUPLE; }
_null_ { return NULLVAL; }
@@ -91,35 +93,35 @@ _null_ { return NULLVAL; }
"(" { return LPAREN; }
")" { return RPAREN; }
-[\n] { yyline++; }
+[\n] { yylineno++; }
[\r\t ] ;
^\#[^\n]* ; /* drop everything after "#" for comments */
-declare { boot_yylval.kw = "declare"; return XDECLARE; }
-build { boot_yylval.kw = "build"; return XBUILD; }
-indices { boot_yylval.kw = "indices"; return INDICES; }
-unique { boot_yylval.kw = "unique"; return UNIQUE; }
-index { boot_yylval.kw = "index"; return INDEX; }
-on { boot_yylval.kw = "on"; return ON; }
-using { boot_yylval.kw = "using"; return USING; }
-toast { boot_yylval.kw = "toast"; return XTOAST; }
-FORCE { boot_yylval.kw = "FORCE"; return XFORCE; }
-NOT { boot_yylval.kw = "NOT"; return XNOT; }
-NULL { boot_yylval.kw = "NULL"; return XNULL; }
+declare { yylval->kw = "declare"; return XDECLARE; }
+build { yylval->kw = "build"; return XBUILD; }
+indices { yylval->kw = "indices"; return INDICES; }
+unique { yylval->kw = "unique"; return UNIQUE; }
+index { yylval->kw = "index"; return INDEX; }
+on { yylval->kw = "on"; return ON; }
+using { yylval->kw = "using"; return USING; }
+toast { yylval->kw = "toast"; return XTOAST; }
+FORCE { yylval->kw = "FORCE"; return XFORCE; }
+NOT { yylval->kw = "NOT"; return XNOT; }
+NULL { yylval->kw = "NULL"; return XNULL; }
{id} {
- boot_yylval.str = pstrdup(yytext);
+ yylval->str = pstrdup(yytext);
return ID;
}
{sid} {
/* strip quotes and escapes */
- boot_yylval.str = DeescapeQuotedString(yytext);
+ yylval->str = DeescapeQuotedString(yytext);
return ID;
}
. {
- elog(ERROR, "syntax error at line %d: unexpected character \"%s\"", yyline, yytext);
+ elog(ERROR, "syntax error at line %d: unexpected character \"%s\"", yylineno, yytext);
}
%%
@@ -127,7 +129,36 @@ NULL { boot_yylval.kw = "NULL"; return XNULL; }
/* LCOV_EXCL_STOP */
void
-boot_yyerror(const char *message)
+boot_yyerror(yyscan_t yyscanner, const char *message)
+{
+ struct yyguts_t * yyg = (struct yyguts_t *) yyscanner; /* needed for yylineno macro */
+
+ elog(ERROR, "%s at line %d", message, yylineno);
+}
+
+/*
+ * Interface functions to make flex use palloc() instead of malloc().
+ * It'd be better to make these static, but flex insists otherwise.
+ */
+
+void *
+yyalloc(yy_size_t size, yyscan_t yyscanner)
+{
+ return palloc(size);
+}
+
+void *
+yyrealloc(void *ptr, yy_size_t size, yyscan_t yyscanner)
+{
+ if (ptr)
+ return repalloc(ptr, size);
+ else
+ return palloc(size);
+}
+
+void
+yyfree(void *ptr, yyscan_t yyscanner)
{
- elog(ERROR, "%s at line %d", message, yyline);
+ if (ptr)
+ pfree(ptr);
}
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index f3a7a007f77..d35ccab4873 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -202,6 +202,7 @@ BootstrapModeMain(int argc, char *argv[], bool check_only)
int flag;
char *userDoption = NULL;
uint32 bootstrap_data_checksum_version = 0; /* No checksum */
+ yyscan_t scanner;
Assert(!IsUnderPostmaster);
@@ -378,11 +379,14 @@ BootstrapModeMain(int argc, char *argv[], bool check_only)
Nulls[i] = false;
}
+ if (boot_yylex_init(&scanner) != 0)
+ elog(ERROR, "yylex_init() failed: %m");
+
/*
* Process bootstrap input.
*/
StartTransactionCommand();
- boot_yyparse();
+ boot_yyparse(scanner);
CommitTransactionCommand();
/*
diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/bootstrap.h
index 73b78b31335..33035d4ed82 100644
--- a/src/include/bootstrap/bootstrap.h
+++ b/src/include/bootstrap/bootstrap.h
@@ -55,9 +55,15 @@ extern void boot_get_type_io_data(Oid typid,
Oid *typinput,
Oid *typoutput);
-extern int boot_yyparse(void);
+union YYSTYPE;
+#ifndef YY_TYPEDEF_YY_SCANNER_T
+#define YY_TYPEDEF_YY_SCANNER_T
+typedef void *yyscan_t;
+#endif
-extern int boot_yylex(void);
-extern void boot_yyerror(const char *message) pg_attribute_noreturn();
+extern int boot_yyparse(yyscan_t yyscanner);
+extern int boot_yylex_init(yyscan_t *yyscannerp);
+extern int boot_yylex(union YYSTYPE *yylval_param, yyscan_t yyscanner);
+extern void boot_yyerror(yyscan_t yyscanner, const char *message) pg_attribute_noreturn();
#endif /* BOOTSTRAP_H */