pgpool2.git / summary / log / commit / refs
commit b4df65285cfe8c314164b89eaca4df9e3901ebd8
Author: Tatsuo Ishii <ishii@postgresql.org>
Date: Sat Jul 21 11:48:28 2012 +0000
Fix pool_extract_table_oids_from_select_stmt. It does not extract
table name correctly if table alias is used. For this new function
make_table_name_from_rangevar is added. unlogged_table_walker was
modified to use this function. Bug report is [pgpool-general: 780].
pool_select_walker.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 46 insertions(+), 4 deletions(-)
diff --git a/pool_select_walker.c b/pool_select_walker.c
index 56119499d..ddd27701a 100644
--- a/pool_select_walker.c
+++ b/pool_select_walker.c
@@ -43,6 +43,7 @@ static bool is_immutable_function(char *fname);
static bool select_table_walker(Node *node, void *context);
static bool non_immutable_function_call_walker(Node *node, void *context);
static char *strip_quote(char *str);
+static char *make_table_name_from_rangevar(RangeVar *rangevar);
/*
* Return true if this SELECT has function calls *and* supposed to
@@ -340,6 +341,7 @@ static bool
unlogged_table_walker(Node *node, void *context)
{
SelectContext *ctx = (SelectContext *) context;
+ char *relname;
if (node == NULL)
return false;
@@ -347,10 +349,10 @@ unlogged_table_walker(Node *node, void *context)
if (IsA(node, RangeVar))
{
RangeVar *rgv = (RangeVar *)node;
+ relname = make_table_name_from_rangevar(rgv);
+ pool_debug("unlogged_table_walker: relname: %s", relname);
- pool_debug("unlogged_table_walker: relname: %s", rgv->relname);
-
- if (is_unlogged_table(rgv->relname))
+ if (is_unlogged_table(relname))
{
ctx->has_unlogged_table = true;
return false;
@@ -955,7 +957,7 @@ select_table_walker(Node *node, void *context)
int oid;
char *s;
- table = nodeToString(rgv);
+ table = make_table_name_from_rangevar(rgv);
oid = pool_table_name_to_oid(table);
if (oid)
@@ -1034,3 +1036,43 @@ makeRangeVarFromNameList(List *names)
return rel;
}
+
+/*
+ * Extract table name from RageVar. Make schema qualification name if
+ * neccessary. The returned table name is in static area. So next
+ * call to this function will break previous result.
+ */
+static char *make_table_name_from_rangevar(RangeVar *rangevar)
+{
+ static char tablename[POOL_NAMEDATALEN*2+1];
+
+ if (rangevar == NULL)
+ {
+ pool_error("make_table_name_from_rangevar: argument is NULL");
+ return "";
+ }
+
+ if (!IsA(rangevar, RangeVar))
+ {
+ pool_error("make_table_name_from_rangevar: argument is not a RangeVar (%d)",
+ ((Node *)rangevar)->type);
+ return "";
+ }
+
+ *tablename = '\0';
+
+ if (rangevar->schemaname)
+ {
+ strncpy(tablename, rangevar->schemaname, POOL_NAMEDATALEN);
+ }
+
+ if (!rangevar->relname)
+ {
+ pool_error("make_table_name_from_rangevar: RangeVar->relname is NULL");
+ return "";
+ }
+
+ strncat(tablename, rangevar->relname, POOL_NAMEDATALEN);
+ pool_debug("make_table_name_from_rangevar: tablename:%s", tablename);
+ return tablename;
+}
[parent: c2e310c3de30]