Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

where中 table_name.column_name in (?,?)无法解析表达式 #214

Closed
gfreezy opened this issue Jan 4, 2017 · 3 comments
Closed

where中 table_name.column_name in (?,?)无法解析表达式 #214

gfreezy opened this issue Jan 4, 2017 · 3 comments

Comments

@gfreezy
Copy link
Contributor

gfreezy commented Jan 4, 2017

select * from tbl where tbl.id in (?, ?) 里面的 tbl.id in (?, ) tbl 没有被解析出来。

日志如下

Logic SQL: SELECT board.id, board.author_id, board.title, board.description, board.accessibility, board.create_time, board.update_time FROM board WHERE board.id IN (?, ?), [23524622263648256, 23524622263648256]
2017-01-04 22:25:28.646 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.sharding.parser.SQLParseEngine   : Parsed SQL result: SQLParsedResult(routeContext=RouteContext(tables=[Table(name=board, alias=Optional.absent())], sqlStatementType=null, sqlBuilder=null), generatedKeyContext=GeneratedKeyContext(columns=[], columnNameToIndexMap={}, valueTable={}, rowIndex=0, columnIndex=0, autoGeneratedKeys=0, columnIndexes=null, columnNames=null), conditionContexts=[ConditionContext(conditions={Condition.Column(columnName=id, tableName=board)=Condition(column=Condition.Column(columnName=id, tableName=board), operator=IN, values=[23524622263648256, 23524622263648256], valueIndices=[0, 1])})], mergeContext=MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null))
2017-01-04 22:25:28.648 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.sharding.parser.SQLParseEngine   : Parsed SQL: SELECT [Token(board)].id, [Token(board)].author_id, [Token(board)].title, [Token(board)].description, [Token(board)].accessibility , [Token(board)].create_time, [Token(board)].update_time FROM [Token(board)] WHERE board.id IN (?, ?)
2017-01-04 22:25:28.651 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.s.r.single.SingleTableRouter     : Before database sharding board routes db names: [ds_0, ds_1] sharding columns: [id] sharding values: [ShardingValue(logicTableName=board, columnName=id, value=null, values=[23524622263648256, 23524622263648256], valueRange=null)]
2017-01-04 22:25:28.654 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.s.r.single.SingleTableRouter     : After database sharding board result: [ds_0]
2017-01-04 22:25:28.654 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.s.r.single.SingleTableRouter     : Before table sharding board routes db names: [DataNode(dataSourceName=ds_0, tableName=board_0002), DataNode(dataSourceName=ds_1, tableName=board_0002), DataNode(dataSourceName=ds_0, tableName=board_0000), DataNode(dataSourceName=ds_1, tableName=board_0000), DataNode(dataSourceName=ds_0, tableName=board_0001), DataNode(dataSourceName=ds_1, tableName=board_0001)] sharding columns: [id] sharding values: [ShardingValue(logicTableName=board, columnName=id, value=null, values=[23524622263648256, 23524622263648256], valueRange=null)]
2017-01-04 22:25:28.654 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.s.r.single.SingleTableRouter     : After table sharding board result: [board_0001]
2017-01-04 22:25:28.659 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.sharding.router.SQLRouteEngine   : final route result is 1 target
2017-01-04 22:25:28.659 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.sharding.router.SQLRouteEngine   : ds_0:SELECT board_0001.id, board_0001.author_id, board_0001.title, board_0001.description, board_0001.accessibility , board_0001.create_time, board_0001.update_time FROM board_0001 WHERE board.id IN (?, ?) [23524622263648256, 23524622263648256]
2017-01-04 22:25:28.659 DEBUG 4234 --- [nio-8080-exec-1] c.d.d.r.sharding.router.SQLRouteEngine   : merge context:MergeContext(orderByColumns=[], groupByColumns=[], aggregationColumns=[], limit=null)
@hanahmily hanahmily changed the title select * from tbl where tbl.id in (?, ?) 没有正确解析 where中 table_name.column_name in (?,?)无法解析表达式 Jan 5, 2017
@hanahmily
Copy link
Contributor

    public final boolean visit(final SQLPropertyExpr x) {
        //对于in表达式,它的parent是null,所以没有解析出来。
        if (!(x.getParent() instanceof SQLBinaryOpExpr) && !(x.getParent() instanceof SQLSelectItem)) {
            return super.visit(x);
        }
        if (!(x.getOwner() instanceof SQLIdentifierExpr)) {
            return super.visit(x);
        }
        String tableOrAliasName = ((SQLIdentifierExpr) x.getOwner()).getLowerName();
        if (getParseContext().isBinaryOperateWithAlias(x, tableOrAliasName)) {
            return super.visit(x);
        }
        printToken(tableOrAliasName);
        print(".");
        print(x.getName());
        return false;
    }

@gfreezy
Copy link
Contributor Author

gfreezy commented Jan 7, 2017

应该怎么修,可以大概解释下吗,我可以来改

@gfreezy
Copy link
Contributor Author

gfreezy commented Jan 7, 2017

druid 新版本已经修复了这个bug,可以将 sjdbc 的 druid 依赖升级吗

alibaba/druid@3cf7cdf

# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
Development

No branches or pull requests

2 participants