diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/bootstrap/bootparse.y | 9 | ||||
-rw-r--r-- | src/backend/bootstrap/bootscanner.l | 91 | ||||
-rw-r--r-- | src/backend/bootstrap/bootstrap.c | 6 | ||||
-rw-r--r-- | src/include/bootstrap/bootstrap.h | 12 |
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 */ |