aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-03-06 21:04:25 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2016-03-06 21:04:25 -0500
commit3899caf772c8dec5c79e553c91f8fc248ca686c9 (patch)
treeb128249dea0d979dc5df240f17c1ac74c272406d /src
parentfd45d16f6212df15821684b231a44448389fb002 (diff)
downloadpostgresql-3899caf772c8dec5c79e553c91f8fc248ca686c9.tar.gz
postgresql-3899caf772c8dec5c79e553c91f8fc248ca686c9.zip
Fix broken definition for function name in pgbench's exprscan.l.
As written, this would accept e.g. 123e9 as a function name. Aside from being mildly astonishing, that would come back to haunt us if we ever try to add float constants to the expression syntax. Insist that function names start with letters (or at least non-digits). In passing reset yyline as well as yycol when starting a new expression. This variable is useless since it's used nowhere, but if we're going to have it we should have it act sanely.
Diffstat (limited to 'src')
-rw-r--r--src/bin/pgbench/exprscan.l13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l
index df673f09f20..cb51a98fd6b 100644
--- a/src/bin/pgbench/exprscan.l
+++ b/src/bin/pgbench/exprscan.l
@@ -35,6 +35,9 @@ static int expr_col = 0;
%option warn
%option prefix="expr_yy"
+alpha [a-zA-Z_]
+digit [0-9]
+alnum [a-zA-Z0-9_]
space [ \t\r\f]
%%
@@ -48,17 +51,17 @@ space [ \t\r\f]
")" { yycol += yyleng; return ')'; }
"," { yycol += yyleng; return ','; }
-:[a-zA-Z0-9_]+ {
+:{alnum}+ {
yycol += yyleng;
yylval.str = pg_strdup(yytext + 1);
return VARIABLE;
}
-[0-9]+ {
+{digit}+ {
yycol += yyleng;
yylval.ival = strtoint64(yytext);
return INTEGER;
}
-[a-zA-Z0-9_]+ {
+{alpha}{alnum}+ {
yycol += yyleng;
yylval.str = pg_strdup(yytext);
return FUNCTION;
@@ -107,8 +110,8 @@ expr_scanner_init(const char *str, const char *source,
expr_command = (char *) cmd;
expr_col = (int) ecol;
- /* reset column count for this scan */
- yycol = 0;
+ /* reset error pointers for this scan */
+ yycol = yyline = 0;
/*
* Might be left over after error