diff options
author | Tom Lane | 2016-03-19 04:24:55 +0000 |
---|---|---|
committer | Tom Lane | 2016-03-19 04:24:55 +0000 |
commit | 0ea9efbe9ec1bf07cc6ae070bdd54700af08e44d (patch) | |
tree | 7d4594ecfec4b8663d80282282bc0cd1e7a7064f /src/bin/psql/psqlscan.h | |
parent | 27199058d98ef7ff2f468af44654bc35bb70fe4a (diff) |
Split psql's lexer into two separate .l files for SQL and backslash cases.
This gets us to a point where psqlscan.l can be used by other frontend
programs for the same purpose psql uses it for, ie to detect when it's
collected a complete SQL command from input that is divided across
line boundaries. Moreover, other programs can supply their own lexers
for backslash commands of their own choosing. A follow-on patch will
use this in pgbench.
The end result here is roughly the same as in Kyotaro Horiguchi's
0001-Make-SQL-parser-part-of-psqlscan-independent-from-ps.patch, although
the details of the method for switching between lexers are quite different.
Basically, in this patch we share the entire PsqlScanState, YY_BUFFER_STATE
stack, *and* yyscan_t between different lexers. The only thing we need
to do to switch to a different lexer is to make sure the start_state is
valid for the new lexer. This works because flex doesn't keep any other
persistent state that depends on the specific lexing tables generated for
a particular .l file. (We are assuming that both lexers are built with
the same flex version, or at least versions that are compatible with
respect to the contents of yyscan_t; but that doesn't seem likely to
be a big problem in practice, considering how slowly flex changes.)
Aside from being more efficient than Horiguchi-san's original solution,
this avoids possible corner-case changes in semantics: the original code
was capable of popping the input buffer stack while still staying in
backslash-related parsing states. I'm not sure that that equates to any
useful user-visible behaviors, but I'm not sure it doesn't either, so
I'm loath to assume that we only need to consider the topmost buffer when
parsing a backslash command.
I've attempted to update the MSVC build scripts for the added .l file,
but will rely on the buildfarm to see if I missed anything.
Kyotaro Horiguchi and Tom Lane
Diffstat (limited to 'src/bin/psql/psqlscan.h')
-rw-r--r-- | src/bin/psql/psqlscan.h | 22 |
1 files changed, 2 insertions, 20 deletions
diff --git a/src/bin/psql/psqlscan.h b/src/bin/psql/psqlscan.h index 82c66dcdf9c..d515ce34f23 100644 --- a/src/bin/psql/psqlscan.h +++ b/src/bin/psql/psqlscan.h @@ -25,17 +25,6 @@ typedef enum PSCAN_EOL /* end of line, SQL possibly complete */ } PsqlScanResult; -/* Different ways for scan_slash_option to handle parameter words */ -enum slash_option_type -{ - OT_NORMAL, /* normal case */ - OT_SQLID, /* treat as SQL identifier */ - OT_SQLIDHACK, /* SQL identifier, but don't downcase */ - OT_FILEPIPE, /* it's a filename or pipe */ - OT_WHOLE_LINE, /* just snarf the rest of the line */ - OT_NO_EVAL /* no expansion of backticks or variables */ -}; - /* Callback functions to be used by the lexer */ typedef struct PsqlScanCallbacks { @@ -61,15 +50,8 @@ extern PsqlScanResult psql_scan(PsqlScanState state, extern void psql_scan_reset(PsqlScanState state); -extern bool psql_scan_in_quote(PsqlScanState state); - -extern char *psql_scan_slash_command(PsqlScanState state); - -extern char *psql_scan_slash_option(PsqlScanState state, - enum slash_option_type type, - char *quote, - bool semicolon); +extern void psql_scan_reselect_sql_lexer(PsqlScanState state); -extern void psql_scan_slash_command_end(PsqlScanState state); +extern bool psql_scan_in_quote(PsqlScanState state); #endif /* PSQLSCAN_H */ |