pgpool2.git / summary / log / commit / refs

commit    275b3e53a8b5617f31e669e85b5c807d07468ebe
Author:   Yoshiyuki Asaba <y-asaba at pgfoundry.org>
Date:     Wed Mar 12 02:01:33 2008 +0000

    Fixed DEALLOCATE ALL processing.


pool_process_query.c | 47 ++++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/pool_process_query.c b/pool_process_query.c index 0b9469763..5e40c0298 100644 --- a/pool_process_query.c +++ b/pool_process_query.c @@ -3622,6 +3622,7 @@ POOL_STATUS SimpleForwardToFrontend(char kind, POOL_CONNECTION *frontend, POOL_C IsA(pending_prepared_portal->stmt, DeallocateStmt)) { free(pending_prepared_portal->portal_name); + pending_prepared_portal->portal_name = NULL; pool_memory_delete(pending_prepared_portal->prepare_ctxt, 0); free(pending_prepared_portal); } @@ -3631,9 +3632,13 @@ POOL_STATUS SimpleForwardToFrontend(char kind, POOL_CONNECTION *frontend, POOL_C /* PREPARE or DEALLOCATE is error. * Free pending portal object. */ - free(pending_prepared_portal->portal_name); - pool_memory_delete(pending_prepared_portal->prepare_ctxt, 0); - free(pending_prepared_portal); + if (pending_prepared_portal) + { + free(pending_prepared_portal->portal_name); + pending_prepared_portal->portal_name = NULL; + pool_memory_delete(pending_prepared_portal->prepare_ctxt, 0); + free(pending_prepared_portal); + } } else if (kind == 'C' && select_in_transaction) select_in_transaction = 0; @@ -5080,25 +5085,33 @@ static void del_prepared_list(PreparedStatementList *p, Portal *portal) int i; DeallocateStmt *s = (DeallocateStmt *)portal->stmt; - for (i = 0; i < p->cnt; i++) + /* DEALLOCATE ALL? */ + if (s->name == NULL) { - PrepareStmt *p_stmt = (PrepareStmt *)p->portal_list[i]->stmt; - if (strcmp(p_stmt->name, s->name) == 0) - break; + reset_prepared_list(p); } + else + { + for (i = 0; i < p->cnt; i++) + { + PrepareStmt *p_stmt = (PrepareStmt *)p->portal_list[i]->stmt; + if (strcmp(p_stmt->name, s->name) == 0) + break; + } - if (i == p->cnt) - return; + if (i == p->cnt) + return; - pool_memory_delete(p->portal_list[i]->prepare_ctxt, 0); - free(p->portal_list[i]->portal_name); - free(p->portal_list[i]); - if (i != p->cnt - 1) - { - memmove(&p->portal_list[i], &p->portal_list[i+1], - sizeof(Portal *) * (p->cnt - i - 1)); + pool_memory_delete(p->portal_list[i]->prepare_ctxt, 0); + free(p->portal_list[i]->portal_name); + free(p->portal_list[i]); + if (i != p->cnt - 1) + { + memmove(&p->portal_list[i], &p->portal_list[i+1], + sizeof(Portal *) * (p->cnt - i - 1)); + } + p->cnt--; } - p->cnt--; } static void delete_all_prepared_list(PreparedStatementList *p, Portal *portal) [parent: 4bb3e586ae9b]