pgpool2.git / summary / log / commit / refs
commit d4d25994626ba2dbd3b2cc81f11598003e8ba997
Author: Tatsuo Ishii <ishii at sraoss.co.jp>
Date: Thu Apr 22 08:10:38 2010 +0000
Fix compiler warnings. Patch contributed by Takahiro Itagaki.
main.c | 4 +-
parser/copyfuncs.c | 2 +-
parser/gram.c | 2 +-
parser/gram.y | 2 +-
parser/makefuncs.c | 6 +--
parser/outfuncs.c | 10 ++++
pcp/pcp.c | 4 +-
pool_connection_pool.c | 4 +-
pool_ip.c | 1 +
pool_lobj.c | 6 +--
pool_process_query.c | 121 +++++++++++++++++++++++++++++++++++++------------
11 files changed, 117 insertions(+), 45 deletions(-)
diff --git a/main.c b/main.c
index e4ba9e17e..c285db9c6 100644
--- a/main.c
+++ b/main.c
@@ -979,7 +979,7 @@ static int create_inet_domain_socket(const char *hostname, const int port)
}
memset((char *) &addr, 0, sizeof(addr));
- ((struct sockaddr *)&addr)->sa_family = AF_INET;
+ addr.sin_family = AF_INET;
if (strcmp(hostname, "*")==0)
{
@@ -1043,7 +1043,7 @@ static int create_unix_domain_socket(struct sockaddr_un un_addr_tmp)
myexit(1);
}
memset((char *) &addr, 0, sizeof(addr));
- ((struct sockaddr *)&addr)->sa_family = AF_UNIX;
+ addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, sizeof(addr.sun_path), un_addr_tmp.sun_path);
len = sizeof(struct sockaddr_un);
status = bind(fd, (struct sockaddr *)&addr, len);
diff --git a/parser/copyfuncs.c b/parser/copyfuncs.c
index 070a8a807..54cf74c0b 100644
--- a/parser/copyfuncs.c
+++ b/parser/copyfuncs.c
@@ -27,7 +27,7 @@
#include <stddef.h>
#include "pool_memory.h"
#include "parsenodes.h"
-#define Assert
+#define Assert(expr) ((void) 0)
/*
diff --git a/parser/gram.c b/parser/gram.c
index 653a309e9..57181693a 100644
--- a/parser/gram.c
+++ b/parser/gram.c
@@ -986,7 +986,7 @@ typedef enum
#define base_yylex filtered_base_yylex
#define ereport(a,b) yyerror("")
-#define Assert
+#define Assert(expr) ((void) 0)
List *parsetree; /* final parse result is delivered here */
static bool QueryIsRule = FALSE;
diff --git a/parser/gram.y b/parser/gram.y
index 473d99e54..be3e39a05 100644
--- a/parser/gram.y
+++ b/parser/gram.y
@@ -99,7 +99,7 @@ typedef enum
#define base_yylex filtered_base_yylex
#define ereport(a,b) yyerror("")
-#define Assert
+#define Assert(expr) ((void) 0)
List *parsetree; /* final parse result is delivered here */
static bool QueryIsRule = FALSE;
diff --git a/parser/makefuncs.c b/parser/makefuncs.c
index a12e7322f..6613c0afa 100644
--- a/parser/makefuncs.c
+++ b/parser/makefuncs.c
@@ -21,9 +21,9 @@
#include <stdlib.h>
#include <string.h>
-#define Assert
-#define ereport(a,b)
-#define elog(a,b)
+#define Assert(expr) ((void) 0)
+#define ereport(a,b) ((void) 0)
+#define elog(a,b) ((void) 0)
#define BOOLOID 16 /* XXX */
diff --git a/parser/outfuncs.c b/parser/outfuncs.c
index 045974c98..2acaf2a66 100644
--- a/parser/outfuncs.c
+++ b/parser/outfuncs.c
@@ -3525,6 +3525,16 @@ _outGrantStmt(String *str, GrantStmt *node)
string_append_char(str, "TABLESPACE ");
_outIdList(str, node->objects);
break;
+
+ case ACL_OBJECT_FDW:
+ string_append_char(str, "FOREIGN DATA WRAPPER ");
+ _outIdList(str, node->objects);
+ break;
+
+ case ACL_OBJECT_FOREIGN_SERVER:
+ string_append_char(str, "FOREIGN SERVER ");
+ _outIdList(str, node->objects);
+ break;
}
if (node->is_grant == true)
diff --git a/pcp/pcp.c b/pcp/pcp.c
index 95e16f559..e252bae03 100644
--- a/pcp/pcp.c
+++ b/pcp/pcp.c
@@ -127,7 +127,7 @@ pcp_connect(char *hostname, int port, char *username, char *password)
}
memset((char *) &addr, 0, sizeof(addr));
- ((struct sockaddr *) &addr)->sa_family = AF_INET;
+ addr.sin_family = AF_INET;
hp = gethostbyname(hostname);
if ((hp == NULL) || (hp->h_addrtype != AF_INET))
{
@@ -293,7 +293,7 @@ pcp_disconnect(void)
{
/* backend had closed connection already */
}
- if (debug) fprintf(stderr, "DEBUG: send: tos=\"X\", len=%d\n", sizeof(int));
+ if (debug) fprintf(stderr, "DEBUG: send: tos=\"X\", len=%d\n", (int) sizeof(int));
pcp_close(pc);
pc = NULL;
diff --git a/pool_connection_pool.c b/pool_connection_pool.c
index 82d748c9b..53605d71f 100644
--- a/pool_connection_pool.c
+++ b/pool_connection_pool.c
@@ -453,7 +453,7 @@ int connect_unix_domain_socket_by_port(int port, char *socket_dir, bool retry)
}
memset((char *) &addr, 0, sizeof(addr));
- ((struct sockaddr *)&addr)->sa_family = AF_UNIX;
+ addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, sizeof(addr.sun_path), "%s/.s.PGSQL.%d", socket_dir, port);
len = sizeof(struct sockaddr_un);
@@ -510,7 +510,7 @@ int connect_inet_domain_socket_by_port(char *host, int port, bool retry)
}
memset((char *) &addr, 0, sizeof(addr));
- ((struct sockaddr *)&addr)->sa_family = AF_INET;
+ addr.sin_family = AF_INET;
addr.sin_port = htons(port);
len = sizeof(struct sockaddr_in);
diff --git a/pool_ip.c b/pool_ip.c
index b6bc571c2..40771d517 100644
--- a/pool_ip.c
+++ b/pool_ip.c
@@ -451,6 +451,7 @@ SockAddr_cidr_mask(struct sockaddr_storage * mask, char *numbits, int family)
& 0xffffffffUL;
else
maskl = 0;
+ memset(&mask4, 0, sizeof(mask4));
mask4.sin_addr.s_addr = htonl(maskl);
memcpy(mask, &mask4, sizeof(mask4));
break;
diff --git a/pool_lobj.c b/pool_lobj.c
index 3e9ec3f41..68213564f 100644
--- a/pool_lobj.c
+++ b/pool_lobj.c
@@ -101,9 +101,9 @@ char *pool_rewrite_lo_creat(char kind, char *packet, int packet_len,
}
/*
- * Get lo_crea oid
+ * Get lo_creat oid
*/
- lo_creat_oid = (int)pool_search_relcache(relcache_lo_creat, backend, "pg_proc");
+ lo_creat_oid = (int)(intptr_t)pool_search_relcache(relcache_lo_creat, backend, "pg_proc");
memmove(&orig_fcall_oid, packet, sizeof(int32));
orig_fcall_oid = ntohl(orig_fcall_oid);
@@ -132,7 +132,7 @@ char *pool_rewrite_lo_creat(char kind, char *packet, int packet_len,
/*
* Get lo_create oid
*/
- lo_create_oid = (int)pool_search_relcache(relcache_lo_create, backend, "pg_proc");
+ lo_create_oid = (int)(intptr_t)pool_search_relcache(relcache_lo_create, backend, "pg_proc");
pool_debug("pool_check_lo_creat: lo_creat_oid: %d lo_create_oid: %d",
lo_creat_oid, lo_create_oid);
diff --git a/pool_process_query.c b/pool_process_query.c
index a3e93f5df..f7180c204 100644
--- a/pool_process_query.c
+++ b/pool_process_query.c
@@ -2650,19 +2650,25 @@ POOL_STATUS do_error_command(POOL_CONNECTION *backend, int major)
}
/*
- * Send invalid portal execution to abort transaction.
- * We need to sync transaction status in transaction block.
- * SELECT query is sent to master only.
- * If SELECT is error, we must abort transaction on other nodes.
+ * Send invalid portal execution to specified DB node to abort current
+ * transaction. Pgpool-II sends a SELECT query to master node only in
+ * load balance mode. Problem is, if the query failed, master node
+ * goes to abort status while other nodes remain normal status. To
+ * sync transaction status in each node, we send error query to other
+ * than master node to ket them go into abort status.
*/
static POOL_STATUS do_error_execute_command(POOL_CONNECTION_POOL *backend, int node_id, int major)
{
int status;
char kind;
char *string;
- char msg[1024] = "pgpoool_error_portal"; /* large enough */
+ char msg[1024] = "pgpool_error_portal"; /* large enough */
int len = strlen(msg);
+ char buf[8192]; /* memory space is large enough */
+ char *p;
+ int readlen = 0;
+ p = buf;
memset(msg + len, 0, sizeof(int));
if (send_execute_message(backend, node_id, len + 5, msg))
{
@@ -2670,34 +2676,89 @@ static POOL_STATUS do_error_execute_command(POOL_CONNECTION_POOL *backend, int n
}
/*
- * Expecting ErrorResponse
+ * Discard responses from backend until ErrorResponse received.
+ * Note that we need to preserve non-error responses
+ * (i.e. ReadyForQuery) and put back them using pool_unread().
+ * Otherwise, ReadyForQuery response of DEALLOCATE. This could
+ * happen if PHP PDO used. (2010/04/21)
*/
- status = pool_read(CONNECTION(backend, node_id), &kind, sizeof(kind));
- if (status < 0)
- {
- pool_error("do_error_execute_command: error while reading message kind");
- return POOL_END;
- }
-
- /*
- * read command tag of CommandComplete response
- */
- if (major == PROTO_MAJOR_V3)
- {
- if (pool_read(CONNECTION(backend, node_id), &len, sizeof(len)) < 0)
- return POOL_END;
- len = ntohl(len) - 4;
- string = pool_read2(CONNECTION(backend, node_id), len);
- if (string == NULL)
+ do {
+ status = pool_read(CONNECTION(backend, node_id), &kind, sizeof(kind));
+ if (status < 0)
+ {
+ pool_error("do_error_execute_command: error while reading message kind");
return POOL_END;
- pool_debug("command tag: %s", string);
- }
- else
- {
- string = pool_read_string(CONNECTION(backend, node_id), &len, 0);
- if (string == NULL)
+ }
+
+ /*
+ * read command tag of CommandComplete response
+ */
+ if (kind != 'E')
+ {
+ readlen += sizeof(kind);
+ memcpy(p, &kind, sizeof(kind));
+ p += sizeof(kind);
+ }
+
+ if (major == PROTO_MAJOR_V3)
+ {
+ if (pool_read(CONNECTION(backend, node_id), &len, sizeof(len)) < 0)
+ return POOL_END;
+
+ if (kind != 'E')
+ {
+ readlen += sizeof(len);
+ memcpy(p, &len, sizeof(len));
+ p += sizeof(len);
+ }
+
+ len = ntohl(len) - 4;
+ string = pool_read2(CONNECTION(backend, node_id), len);
+ if (string == NULL)
+ return POOL_END;
+ pool_debug("command tag: %s", string);
+
+ if (kind != 'E')
+ {
+ readlen += len;
+ if (readlen >= sizeof(buf))
+ {
+ pool_error("do_error_execute_command: not enough buffer space");
+ return POOL_END;
+ }
+ memcpy(p, string, len);
+ p += sizeof(len);
+ }
+ }
+ else
+ {
+ string = pool_read_string(CONNECTION(backend, node_id), &len, 0);
+ if (string == NULL)
+ return POOL_END;
+
+ if (kind != 'E')
+ {
+ readlen += len;
+ if (readlen >= sizeof(buf))
+ {
+ pool_error("do_error_execute_command: not enough buffer space");
+ return POOL_END;
+ }
+ memcpy(p, string, len);
+ p += sizeof(len);
+ }
+ }
+ } while (kind != 'E');
+
+ if (readlen > 0)
+ {
+ /* put messages back to read buffer */
+ if (pool_unread(CONNECTION(backend, node_id), buf, readlen) != 0)
+ {
+ pool_error("do_error_execute_command: pool_unread failed");
return POOL_END;
- }
+ }
+ }
return POOL_CONTINUE;
}
[parent: a0c7a1bbf1f8]