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]