diff options
Diffstat (limited to 'src/bin/psql/common.c')
-rw-r--r-- | src/bin/psql/common.c | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 066dccbd841..8a9211db41a 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1275,27 +1275,7 @@ sendquery_cleanup: } /* clean up after extended protocol queries */ - switch (pset.send_mode) - { - case PSQL_SEND_EXTENDED_CLOSE: /* \close */ - free(pset.stmtName); - break; - case PSQL_SEND_EXTENDED_PARSE: /* \parse */ - free(pset.stmtName); - break; - case PSQL_SEND_EXTENDED_QUERY_PARAMS: /* \bind */ - case PSQL_SEND_EXTENDED_QUERY_PREPARED: /* \bind_named */ - for (i = 0; i < pset.bind_nparams; i++) - free(pset.bind_params[i]); - free(pset.bind_params); - free(pset.stmtName); - pset.bind_params = NULL; - break; - case PSQL_SEND_QUERY: - break; - } - pset.stmtName = NULL; - pset.send_mode = PSQL_SEND_QUERY; + clean_extended_state(); /* reset \gset trigger */ if (pset.gset_prefix) @@ -2288,6 +2268,43 @@ uri_prefix_length(const char *connstr) } /* + * Reset state related to extended query protocol + * + * Clean up any state related to bind parameters, statement name and + * PSQL_SEND_MODE. This needs to be called after processing a query or when + * running a new meta-command that uses the extended query protocol, like + * \parse, \bind, etc. + */ +void +clean_extended_state(void) +{ + int i; + + switch (pset.send_mode) + { + case PSQL_SEND_EXTENDED_CLOSE: /* \close */ + free(pset.stmtName); + break; + case PSQL_SEND_EXTENDED_PARSE: /* \parse */ + free(pset.stmtName); + break; + case PSQL_SEND_EXTENDED_QUERY_PARAMS: /* \bind */ + case PSQL_SEND_EXTENDED_QUERY_PREPARED: /* \bind_named */ + for (i = 0; i < pset.bind_nparams; i++) + free(pset.bind_params[i]); + free(pset.bind_params); + free(pset.stmtName); + pset.bind_params = NULL; + break; + case PSQL_SEND_QUERY: + break; + } + + pset.stmtName = NULL; + pset.send_mode = PSQL_SEND_QUERY; +} + +/* * Recognized connection string either starts with a valid URI prefix or * contains a "=" in it. * |