1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-02 04:21:28 +03:00

Add a "void *" passthrough pointer for psqlscan.l's callback functions.

The immediate motivation for this is to provide clean infrastructure
for the proposed \if...\endif patch for psql; but it seems like a good
thing to have even if that patch doesn't get in.  Previously the callback
functions could only make use of application-global state, which is a
pretty severe handicap.

For the moment, the pointer is only passed through to the get_variable
callback function.  I considered also passing it to the write_error
callback, but for now let's not.  Neither psql nor pgbench has a use
for that, and in the case of psql we'd have to invent a separate wrapper
function because we would certainly not want to change the signature of
psql_error().

Discussion: https://postgr.es/m/10108.1489418309@sss.pgh.pa.us
This commit is contained in:
Tom Lane
2017-03-13 17:14:46 -04:00
parent 1c7a66a8e9
commit 895e36bb3f
6 changed files with 33 additions and 7 deletions

View File

@@ -700,7 +700,8 @@ other .
if (cur_state->callbacks->get_variable)
value = cur_state->callbacks->get_variable(varname,
false,
false);
false,
cur_state->cb_passthrough);
else
value = NULL;
@@ -922,6 +923,19 @@ psql_scan_destroy(PsqlScanState state)
free(state);
}
/*
* Set the callback passthrough pointer for the lexer.
*
* This could have been integrated into psql_scan_create, but keeping it
* separate allows the application to change the pointer later, which might
* be useful.
*/
void
psql_scan_set_passthrough(PsqlScanState state, void *passthrough)
{
state->cb_passthrough = passthrough;
}
/*
* Set up to perform lexing of the given input line.
*
@@ -1409,7 +1423,8 @@ psqlscan_escape_variable(PsqlScanState state, const char *txt, int len,
/* Variable lookup. */
varname = psqlscan_extract_substring(state, txt + 2, len - 3);
if (state->callbacks->get_variable)
value = state->callbacks->get_variable(varname, true, as_ident);
value = state->callbacks->get_variable(varname, true, as_ident,
state->cb_passthrough);
else
value = NULL;
free(varname);