int nparams = 0;
int nalloc = 0;
- pset.bind_params = NULL;
- pset.stmtName = NULL;
+ clean_extended_state();
while ((opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false)))
{
int nparams = 0;
int nalloc = 0;
- pset.bind_params = NULL;
- pset.stmtName = NULL;
+ clean_extended_state();
/* get the mandatory prepared statement name */
opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false);
char *opt = psql_scan_slash_option(scan_state,
OT_NORMAL, NULL, false);
- pset.stmtName = NULL;
+ clean_extended_state();
+
if (!opt)
{
pg_log_error("\\%s: missing required argument", cmd);
char *opt = psql_scan_slash_option(scan_state,
OT_NORMAL, NULL, false);
- pset.stmtName = NULL;
+ clean_extended_state();
+
if (!opt)
{
pg_log_error("\\%s: missing required argument", cmd);
}
/* 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)
return 0;
}
+/*
+ * 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.
foo | bar
(1 row)
+-- Repeated calls. The second call generates an error, cleaning up the
+-- statement name set by the first call.
+\bind_named stmt4
+\bind_named
+\bind_named: missing required argument
+\g
+ERROR: there is no parameter $1
+LINE 1: SELECT $1, $2
+ ^
-- \close (extended query protocol)
\close
\close: missing required argument