pgpool2.git / summary / log / commit / refs
commit e0eeb2f396f38941783fc97a4f13b37be95f6235
Author: Toshihiro Kitagawa <kitagawa at sraoss.co.jp>
Date: Tue Jul 13 01:00:17 2010 +0000
Fix SimpleQuery(). Now it execute EXECUTE and DEALLOCATE statement correctly.
pool_proto_modules.c | 47 +++++++++++++++++++++++------------------------
pool_session_context.c | 18 +++++++++++++++---
pool_session_context.h | 4 ++--
3 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/pool_proto_modules.c b/pool_proto_modules.c
index d63267e12..0d295385d 100644
--- a/pool_proto_modules.c
+++ b/pool_proto_modules.c
@@ -105,12 +105,12 @@ static int is_temp_table(POOL_CONNECTION_POOL *backend, Node *node);
POOL_STATUS SimpleQuery(POOL_CONNECTION *frontend,
POOL_CONNECTION_POOL *backend, char *query)
{
- char *string, *string1;
+ char *string;
int len;
static char *sq = "show pool_status";
int commit;
List *parse_tree_list;
- Node *node = NULL, *node1;
+ Node *node = NULL;
POOL_STATUS status;
POOL_SESSION_CONTEXT *session_context;
@@ -196,6 +196,11 @@ static int is_temp_table(POOL_CONNECTION_POOL *backend, Node *node);
}
}
+ /*
+ * Start query context
+ */
+ pool_start_query(query_context, string, node);
+
if (PARALLEL_MODE)
{
bool parallel = true;
@@ -289,7 +294,10 @@ static int is_temp_table(POOL_CONNECTION_POOL *backend, Node *node);
PreparedStatement *ps;
name = ((DeallocateStmt *)node)->name;
- ps = pool_create_prepared_statement(name, 0, query_context);
+ if (name == NULL)
+ ps = pool_create_prepared_statement("", 0, query_context);
+ else
+ ps = pool_create_prepared_statement(name, 0, query_context);
if (ps == NULL)
{
pool_error("SimpleQuery: failed to create prepared statement: %s", strerror(errno));
@@ -320,33 +328,19 @@ static int is_temp_table(POOL_CONNECTION_POOL *backend, Node *node);
PreparedStatement *ps;
ps = pool_get_prepared_statement_by_pstmt_name(((ExecuteStmt *)node)->name);
-
if (ps)
{
- string1 = ps->qctxt->original_query;
- node1 = ps->qctxt->parse_tree;
- }
- else
- {
- string1 = string;
- node1 = node;
+ free_parser();
+ pool_query_context_destroy(query_context);
+ query_context = ps->qctxt;
}
}
- else
- {
- string1 = string;
- node1 = node;
- }
-
- /*
- * Start query context
- */
- pool_start_query(query_context, string1, node1);
/*
* Decide where to send query
*/
- pool_where_to_send(query_context, string1, node1);
+ pool_where_to_send(query_context, query_context->original_query,
+ query_context->parse_tree);
/*
* determine if we need to lock the table
@@ -431,15 +425,20 @@ static int is_temp_table(POOL_CONNECTION_POOL *backend, Node *node);
ps = pool_get_prepared_statement_by_pstmt_name(((ExecuteStmt *) node)->name);
/* rewrite `now()' to timestamp literal */
- rewrite_query = rewrite_timestamp(backend, node, false, ps);
+ rewrite_query = rewrite_timestamp(backend, query_context->parse_tree, false, ps);
if (rewrite_query != NULL)
{
- string = rewrite_query;
+ query_context->rewritten_query = rewrite_query;
len = strlen(string) + 1;
}
}
+ if (query_context->rewritten_query == NULL)
+ string = query_context->original_query;
+ else
+ string = query_context->rewritten_query;
+
/*
* Optimization effort: If there's only one session, we do
* not need to wait for the master node's response, and
diff --git a/pool_session_context.c b/pool_session_context.c
index 5539cd31c..401ed61b4 100644
--- a/pool_session_context.c
+++ b/pool_session_context.c
@@ -421,9 +421,10 @@ void pool_clear_prepared_statement_list(void)
/*
* Create a prepared statement
*/
-void *pool_create_prepared_statement(const char *name, int num_tsparams, POOL_QUERY_CONTEXT *qc)
+PreparedStatement *pool_create_prepared_statement(const char *name, int num_tsparams, POOL_QUERY_CONTEXT *qc)
{
PreparedStatement *ps;
+ POOL_QUERY_CONTEXT *q;
if (!session_context)
{
@@ -435,7 +436,18 @@ void *pool_create_prepared_statement(const char *name, int num_tsparams, POOL_QU
sizeof(PreparedStatement));
ps->name = pool_memory_strdup(session_context->memory_context, name);
ps->num_tsparams = num_tsparams;
- ps->qctxt = qc;
+
+ /*
+ * duplicate query_context because session_context->query_context is
+ * freed by pool_query_context_destroy()
+ */
+ q = malloc(sizeof(POOL_QUERY_CONTEXT));
+ if (q == NULL)
+ {
+ pool_error("pool_create_prepared_statement: malloc failed: %s", strerror(errno));
+ exit(1);
+ }
+ ps->qctxt = memcpy(q, qc, sizeof(POOL_QUERY_CONTEXT));
return ps;
}
@@ -443,7 +455,7 @@ void *pool_create_prepared_statement(const char *name, int num_tsparams, POOL_QU
/*
* Create a portal
*/
-void *pool_create_portal(const char *name, int num_tsparams, PreparedStatement *pstmt)
+Portal *pool_create_portal(const char *name, int num_tsparams, PreparedStatement *pstmt)
{
Portal *portal;
diff --git a/pool_session_context.h b/pool_session_context.h
index 79bcc1589..c0e50aa38 100644
--- a/pool_session_context.h
+++ b/pool_session_context.h
@@ -167,8 +167,8 @@ extern void pool_remove_prepared_statement(void);
extern void pool_remove_portal(void);
extern void pool_remove_pending_objects(void);
extern void pool_clear_prepared_statement_list(void);
-extern void *pool_create_prepared_statement(const char *name, int num_tsparams, POOL_QUERY_CONTEXT *qc);
-extern void *pool_create_portal(const char *name, int num_tsparams, PreparedStatement *pstmt);
+extern PreparedStatement *pool_create_prepared_statement(const char *name, int num_tsparams, POOL_QUERY_CONTEXT *qc);
+extern Portal *pool_create_portal(const char *name, int num_tsparams, PreparedStatement *pstmt);
extern void pool_add_prepared_statement(void);
extern void pool_add_portal(void);
extern PreparedStatement *pool_get_prepared_statement_by_pstmt_name(const char *name);
[parent: 9e334340a7dc]