pgpool2.git / summary / log / commit / refs
commit 6f6d26798300e65f09c56aeb8994adb7bc85db4c
Author: Yoshiharu Mori <y-mori at sraoss.co.jp>
Date: Tue Jul 01 12:26:22 2008 +0000
fix: Converting JOIN expression from USING to ON in query rewriting at parallel mode
pool_rewrite_outfuncs.c | 123 ++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 103 insertions(+), 20 deletions(-)
diff --git a/pool_rewrite_outfuncs.c b/pool_rewrite_outfuncs.c
index a79dbe75c..1d23637e4 100644
--- a/pool_rewrite_outfuncs.c
+++ b/pool_rewrite_outfuncs.c
@@ -2110,6 +2110,81 @@ _rewriteRangeTblRef(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *db
}
+static char *GetTableName(Node *node)
+{
+
+ if(IsA(node, RangeVar))
+ {
+ RangeVar *range = (RangeVar *)node;
+ if(range->alias)
+ {
+ Alias *alias = range->alias;
+ return alias->aliasname;
+ } else {
+ return range->relname;
+ }
+ }
+ else if (IsA(node,RangeSubselect))
+ {
+ RangeSubselect *select = (RangeSubselect *)node;
+ Alias * alias = select->alias;
+ return alias->aliasname;
+ }
+ return NULL;
+}
+
+static int RetVirtualColumn(VirtualTable *virtual, char *tablename, char *colname)
+{
+ int col_num = virtual->col_num;
+ int i;
+ for( i = 0; i < col_num; i++)
+ {
+ if(strcmp(virtual->col_list[i], colname) == 0
+ && strcmp(virtual->table_list[i], tablename) == 0)
+ {
+ return virtual->column_no[i];
+ }
+ }
+
+ /* ERROR OR AMBIGIUS */
+ return -1;
+}
+
+static void
+ConvertFromUsingToON(RewriteQuery *message, String *str, JoinExpr *node, int select_num)
+{
+ char *lname;
+ char *rname;
+ char comma = 0;
+ ListCell *lc;
+ VirtualTable *virtual = message->analyze[select_num]->virtual;
+
+ lname = GetTableName(node->larg);
+ rname = GetTableName(node->rarg);
+
+ foreach (lc, node->using)
+ {
+ Value *value;
+ char lbuf[16];
+ char rbuf[16];
+
+ if (comma == 0)
+ comma = 1;
+ else
+ delay_string_append_char(message, str, " AND ");
+
+ value = lfirst(lc);
+ snprintf(lbuf, 16, "%d",RetVirtualColumn(virtual,lname,value->val.str));
+ snprintf(rbuf, 16, "%d",RetVirtualColumn(virtual,rname,value->val.str));
+ delay_string_append_char(message, str, " pool_c$");
+ delay_string_append_char(message, str, lbuf);
+ delay_string_append_char(message, str, " = ");
+ delay_string_append_char(message, str, " pool_c$");
+ delay_string_append_char(message, str, rbuf);
+ delay_string_append_char(message, str, " ");
+ }
+}
+
static void
_rewriteJoinExpr(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *dblink, String *str, JoinExpr *node)
{
@@ -2187,7 +2262,7 @@ _rewriteJoinExpr(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *dblin
_rewriteNode(BaseSelect, message, dblink, str, node->rarg);
- r_state = message->table_state;
+ r_state = message->table_state;
message->fromClause = from;
message->current_select = select_num;
@@ -2198,7 +2273,7 @@ _rewriteJoinExpr(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *dblin
if(IsA(node->rarg, RangeVar) || IsA(node->rarg,RangeSubselect))
{
- if(natural && inner)
+ if(natural && inner)
build_join_table(message,aliasname,JNATURAL_INNER);
else if(natural && left)
build_join_table(message,aliasname,JNATURAL_LEFT);
@@ -2217,30 +2292,38 @@ _rewriteJoinExpr(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *dblin
using_length= list_length(node->using);
using_list = (char **) palloc(sizeof(char *) * using_length);
-
- delay_string_append_char(message, str, " USING(");
- foreach (lc, node->using)
+ if(message->r_code == SELECT_DEFAULT
+ && message->analyze[select_num]->state == 'S')
{
- Value *value;
+ /* Rewrite Using Cluase to On Clause */
+ delay_string_append_char(message, str, " ON");
+ ConvertFromUsingToON(message, str, node, select_num);
+ } else {
+ delay_string_append_char(message, str, " USING(");
- if (comma == 0)
- comma = 1;
- else
- delay_string_append_char(message, str, ",");
+ foreach (lc, node->using)
+ {
+ Value *value;
+
+ if (comma == 0)
+ comma = 1;
+ else
+ delay_string_append_char(message, str, ",");
- value = lfirst(lc);
- delay_string_append_char(message, str, "\"");
- delay_string_append_char(message, str, value->val.str);
- delay_string_append_char(message, str, "\"");
- using_list[count] = value->val.str;
- count++;
- }
+ value = lfirst(lc);
+ delay_string_append_char(message, str, "\"");
+ delay_string_append_char(message, str, value->val.str);
+ delay_string_append_char(message, str, "\"");
+ using_list[count] = value->val.str;
+ count++;
+ }
- message->analyze[select_num]->join->using_length = using_length;
- message->analyze[select_num]->join->using_list = using_list;
+ message->analyze[select_num]->join->using_length = using_length;
+ message->analyze[select_num]->join->using_list = using_list;
- delay_string_append_char(message, str, ")");
+ delay_string_append_char(message, str, ")");
+ }
}
[parent: 19e9bcc967fe]