static PreparedStatement *lookup_prepared_statement_by_statement(PreparedStatementList *p, const char *name);
static PreparedStatement *lookup_prepared_statement_by_portal(PreparedStatementList *p, const char *name);
static int send_deallocate(POOL_CONNECTION_POOL *backend, PreparedStatementList *p, int n);
+static char *normalize_prepared_stmt_name(const char *name);
static POOL_CONNECTION_POOL_SLOT *slots[MAX_CONNECTION_SLOTS];
return POOL_END;
}
- pending_prepared_stmt->statement_name = strdup(name);
+ pending_prepared_stmt->statement_name = normalize_prepared_stmt_name(name);
pending_prepared_stmt->portal_name = NULL;
- if (pending_prepared_stmt->portal_name == NULL ||
- pending_prepared_stmt->statement_name == NULL)
+ if (pending_prepared_stmt->statement_name == NULL)
{
pool_error("SimpleForwardToBackend: strdup failed: %s", strerror(errno));
return POOL_END;
{
char *stmt;
- name_len = strlen(p) + 3;
- name = malloc(name_len);
+ name = strdup(p);
if (name == NULL)
{
pool_error("SimpleForwardToBackend: malloc failed: %s", strerror(errno));
return POOL_END;
}
- sprintf(name, "\"%s\"", p);
pending_prepared_stmt = malloc(sizeof(PreparedStatement));
if (pending_prepared_stmt == NULL)
{
if (stmt->portal_name)
free(stmt->portal_name);
- stmt->portal_name = strdup(portal_name);
+ stmt->portal_name = strdup(stmt->portal_name);
}
}
return POOL_END;
}
- pending_prepared_stmt->statement_name = strdup(name);
+ pending_prepared_stmt->statement_name = normalize_prepared_stmt_name(name);
if (pending_prepared_stmt->statement_name == NULL)
{
pool_error("SimpleForwardToBackend: malloc failed: %s", strerror(errno));
memcpy(string, query, len);
stmt = malloc(sizeof(PreparedStatement));
- stmt->statement_name = strdup(portal);
+ stmt->statement_name = normalize_prepared_stmt_name(portal);
stmt->portal_name = NULL;
stmt->prepared_string = string;
- pool_debug("get_prepared_command_portal_and_statement: extracted portal name: %s portal statement: %s", stmt->portal_name, stmt->prepared_string);
-
return stmt;
}
if (p->cnt <= n)
return 1;
- len = strlen(p->stmt_list[n]->statement_name) + 12; /* "DEALLOCATE " + '\0' */
+ len = strlen(p->stmt_list[n]->statement_name) + 14; /* "DEALLOCATE \"" + "\"" + '\0' */
query = malloc(len);
if (query == NULL)
{
pool_error("send_deallocate: malloc failed: %s", strerror(errno));
exit(1);
}
- sprintf(query, "DEALLOCATE %s", p->stmt_list[n]->statement_name);
+ sprintf(query, "DEALLOCATE \"%s\"", p->stmt_list[n]->statement_name);
if (Query(NULL, backend, query) != POOL_CONTINUE)
{
free(query);
return 0;
}
+
+static char *normalize_prepared_stmt_name(const char *name)
+{
+ char *result;
+ int i, len;
+
+ len = strlen(name);
+
+ if (name[0] != '"' && name[len-1] != '"')
+ {
+ result = strdup(name);
+ if (result == NULL)
+ return result;
+ for (i = 0; i < len; i++)
+ {
+ if (isupper(result[i]))
+ {
+ result[i] += 32; /* convert to lower */
+ }
+ }
+ }
+ else
+ {
+ result = malloc(len - 1);
+ if (result == NULL)
+ return result;
+
+ result = memcpy(result, name+1, len-2);
+ result[len-1] = '\0';
+ }
+
+ return result;
+}