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]