pgpool2.git / summary / log / commit / refs

commit    7be062363b7f511e84db4f2c613740c9969a6d42
Author:   Yoshiyuki Asaba <y-asaba at pgfoundry.org>
Date:     Wed Oct 03 05:21:22 2007 +0000

    Reset a prepared statement list when DISCARD ALL or DISCARD PLANS
    statement is completed.


pool_process_query.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pool_process_query.c b/pool_process_query.c index 3399aaf28..905827d15 100644 --- a/pool_process_query.c +++ b/pool_process_query.c @@ -156,6 +156,7 @@ static char *get_insert_command_table_name(InsertStmt *node); static void add_prepared_list(PreparedStatementList *p, Portal *portal); static void add_unnamed_portal(PreparedStatementList *p, Portal *portal); static void del_prepared_list(PreparedStatementList *p, Portal *portal); +static void delete_all_prepared_list(PreparedStatementList *p, Portal *portal); static void reset_prepared_list(PreparedStatementList *p); static int send_deallocate(POOL_CONNECTION_POOL *backend, PreparedStatementList *p, int n); static char *parse_copy_data(char *buf, int len, char delimiter, int col_id); @@ -1008,6 +1009,15 @@ static POOL_STATUS SimpleQuery(POOL_CONNECTION *frontend, portal->stmt = copyObject(node); pending_prepared_portal = portal; } + else if (IsA(node, DiscardStmt)) + { + DiscardStmt *stmt = (DiscardStmt *)node; + if (stmt->target == DISCARD_ALL || stmt->target == DISCARD_PLANS) + { + pending_function = delete_all_prepared_list; + pending_prepared_portal = NULL; + } + } /* switch old memory context */ pool_memory = old_context; @@ -1391,8 +1401,9 @@ static POOL_STATUS Execute(POOL_CONNECTION *frontend, * forward message until receiving CommandComplete, * ErrorResponse, EmptyQueryResponse or PortalSuspend. */ - if (kind == 'C' || kind == 'E' || kind != 'I' || kind != 's') + if (kind == 'C' || kind == 'E' || kind == 'I' || kind == 's') break; + status = SimpleForwardToFrontend(kind, frontend, backend); if (status != POOL_CONTINUE) return status; @@ -3467,7 +3478,7 @@ POOL_STATUS SimpleForwardToFrontend(char kind, POOL_CONNECTION *frontend, POOL_C * unregister pending prepared statement. */ if ((kind == 'C' || kind == '1' || kind == '3') && - pending_function && pending_prepared_portal) + pending_function) { pending_function(&prepared_list, pending_prepared_portal); if (pending_prepared_portal && @@ -4842,6 +4853,11 @@ static void del_prepared_list(PreparedStatementList *p, Portal *portal) p->cnt--; } +static void delete_all_prepared_list(PreparedStatementList *p, Portal *portal) +{ + reset_prepared_list(p); +} + static void reset_prepared_list(PreparedStatementList *p) { int i; [parent: 2ead8326f4ce]