pgpool2.git / summary / log / commit / refs

commit    051971e11f8523d20d440bc919e10a0e54aac3fd
Author:   Yoshiharu Mori <y-mori at sraoss.co.jp>
Date:     Wed Oct 31 03:49:22 2007 +0000

    FIX: "IN" predicate at query rewriting


pool_rewrite_outfuncs.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/pool_rewrite_outfuncs.c b/pool_rewrite_outfuncs.c index ba339a25b..74b30dfd9 100644 --- a/pool_rewrite_outfuncs.c +++ b/pool_rewrite_outfuncs.c @@ -4184,6 +4184,8 @@ _rewriteSetOperationStmt(Node *BaseSelect, RewriteQuery *message, ConInfoTodblin static void _rewriteAExpr(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *dblink, String *str, A_Expr *node) { + Value *v; + switch (node->kind) { case AEXPR_OP: @@ -4222,11 +4224,21 @@ _rewriteAExpr(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *dblink, break; case AEXPR_OP_ANY: - /* not implemented yet */ + _rewriteNode(BaseSelect,message,dblink,str, node->lexpr); + v = linitial(node->name); + delay_string_append_char(message,str, v->val.str); + delay_string_append_char(message,str, "ANY("); + _rewriteNode(BaseSelect,message,dblink,str, node->rexpr); + delay_string_append_char(message,str, ")"); break; case AEXPR_OP_ALL: - /* not implemented yet */ + _rewriteNode(BaseSelect,message,dblink,str, node->lexpr); + v = linitial(node->name); + delay_string_append_char(message,str, v->val.str); + delay_string_append_char(message,str, "ALL("); + _rewriteNode(BaseSelect,message,dblink,str, node->rexpr); + delay_string_append_char(message,str, ")"); break; case AEXPR_DISTINCT: @@ -4247,14 +4259,24 @@ _rewriteAExpr(Node *BaseSelect, RewriteQuery *message, ConInfoTodblink *dblink, case AEXPR_OF: _rewriteNode(BaseSelect, message, dblink, str, node->lexpr); - if (*(char *)lfirst(list_head(node->name)) == '!') + v = linitial(node->name); + if (v->val.str[0] == '!') delay_string_append_char(message, str, " IS NOT OF ("); else delay_string_append_char(message, str, " IS OF ("); _rewriteNode(BaseSelect, message, dblink, str, node->rexpr); delay_string_append_char(message, str, ")"); break; - + case AEXPR_IN: + _rewriteNode(BaseSelect,message,dblink,str, node->lexpr); + v = (Value *)lfirst(list_head(node->name)); + if (v->val.str[0] == '=') + delay_string_append_char(message,str, " IN ("); + else + delay_string_append_char(message,str, " NOT IN ("); + _rewriteNode(BaseSelect,message,dblink,str, node->rexpr); + delay_string_append_char(message,str, ")"); + break; default: break; } [parent: 8448733ea28f]