hi all
请教大家在复杂sql语句中parse所有的table name是怎么实现的。 谢谢 -- Best Regards, Harold Miao |
可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
在 2020-09-21 10:12:13,"Harold.Miao" <[hidden email]> 写道: >hi all > >请教大家在复杂sql语句中parse所有的table name是怎么实现的。 > >谢谢 > >-- > >Best Regards, >Harold Miao |
主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
郭士榕 <[hidden email]> 于2020年9月21日周一 上午10:21写道: > 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。 > > > > > > 在 2020-09-21 10:12:13,"Harold.Miao" <[hidden email]> 写道: > >hi all > > > >请教大家在复杂sql语句中parse所有的table name是怎么实现的。 > > > >谢谢 > > > >-- > > > >Best Regards, > >Harold Miao > -- Best Regards, Harold Miao |
就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。 在 2020-09-21 10:50:31,"Harold.Miao" <[hidden email]> 写道: >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。 > >郭士榕 <[hidden email]> 于2020年9月21日周一 上午10:21写道: > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。 >> >> >> >> >> >> 在 2020-09-21 10:12:13,"Harold.Miao" <[hidden email]> 写道: >> >hi all >> > >> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。 >> > >> >谢谢 >> > >> >-- >> > >> >Best Regards, >> >Harold Miao >> > > >-- > >Best Regards, >Harold Miao |
主要是我没有完整的所有单元case, 总是感觉写的不完整。
郭士榕 <[hidden email]> 于2020年9月21日周一 上午11:08写道: > > > > 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。 > > > > > > > > > > > > > > > 在 2020-09-21 10:50:31,"Harold.Miao" <[hidden email]> 写道: > >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。 > > > >郭士榕 <[hidden email]> 于2020年9月21日周一 上午10:21写道: > > > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。 > >> > >> > >> > >> > >> > >> 在 2020-09-21 10:12:13,"Harold.Miao" <[hidden email]> 写道: > >> >hi all > >> > > >> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。 > >> > > >> >谢谢 > >> > > >> >-- > >> > > >> >Best Regards, > >> >Harold Miao > >> > > > > > >-- > > > >Best Regards, > >Harold Miao > -- Best Regards, Harold Miao |
我感觉可以先把SQL转成RelNode,然后用Calcite的visitor模式的RelShuttle来获取?
Harold.Miao <[hidden email]> 于2020年9月21日周一 下午1:58写道: > 主要是我没有完整的所有单元case, 总是感觉写的不完整。 > > 郭士榕 <[hidden email]> 于2020年9月21日周一 上午11:08写道: > > > > > > > > > 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 在 2020-09-21 10:50:31,"Harold.Miao" <[hidden email]> 写道: > > >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。 > > > > > >郭士榕 <[hidden email]> 于2020年9月21日周一 上午10:21写道: > > > > > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。 > > >> > > >> > > >> > > >> > > >> > > >> 在 2020-09-21 10:12:13,"Harold.Miao" <[hidden email]> 写道: > > >> >hi all > > >> > > > >> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。 > > >> > > > >> >谢谢 > > >> > > > >> >-- > > >> > > > >> >Best Regards, > > >> >Harold Miao > > >> > > > > > > > > >-- > > > > > >Best Regards, > > >Harold Miao > > > > > -- > > Best Regards, > Harold Miao > -- Best, Benchao Li |
大佬 能不能给点示例
Benchao Li <[hidden email]> 于2020年9月21日周一 下午4:38写道: > 我感觉可以先把SQL转成RelNode,然后用Calcite的visitor模式的RelShuttle来获取? > > Harold.Miao <[hidden email]> 于2020年9月21日周一 下午1:58写道: > > > 主要是我没有完整的所有单元case, 总是感觉写的不完整。 > > > > 郭士榕 <[hidden email]> 于2020年9月21日周一 上午11:08写道: > > > > > > > > > > > > > > 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 在 2020-09-21 10:50:31,"Harold.Miao" <[hidden email]> 写道: > > > >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。 > > > > > > > >郭士榕 <[hidden email]> 于2020年9月21日周一 上午10:21写道: > > > > > > > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。 > > > >> > > > >> > > > >> > > > >> > > > >> > > > >> 在 2020-09-21 10:12:13,"Harold.Miao" <[hidden email]> 写道: > > > >> >hi all > > > >> > > > > >> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。 > > > >> > > > > >> >谢谢 > > > >> > > > > >> >-- > > > >> > > > > >> >Best Regards, > > > >> >Harold Miao > > > >> > > > > > > > > > > > >-- > > > > > > > >Best Regards, > > > >Harold Miao > > > > > > > > > -- > > > > Best Regards, > > Harold Miao > > > > > -- > > Best, > Benchao Li > -- Best Regards, Harold Miao |
In reply to this post by Harold.Miao
写过一个类似的可以参考一下
private static List<String> lookupSelectTable(SqlNode sqlNode) { List<String> list = new ArrayList<>(); if (sqlNode instanceof SqlSelect) { SqlNode from = ((SqlSelect) sqlNode).getFrom(); list.addAll(lookupSelectTable(from)); } else if (sqlNode instanceof SqlJoin) { SqlJoin sqlJoin = (SqlJoin) sqlNode; list.addAll(lookupSelectTable(sqlJoin.getLeft())); list.addAll(lookupSelectTable(sqlJoin.getRight())); } else if (sqlNode instanceof SqlBasicCall) { SqlBasicCall sqlBasicCall = (SqlBasicCall) sqlNode; SqlOperator operator = sqlBasicCall.getOperator(); if (SqlKind.AS.equals(operator.getKind())) { list.addAll(lookupSelectTable(sqlBasicCall.getOperands()[0])); } else if (SqlKind.UNION.equals(operator.getKind())) { for (SqlNode operandSqlNode : sqlBasicCall.getOperands()) { list.addAll(lookupSelectTable(operandSqlNode)); } } else { throw new RuntimeException("operator " + operator.getKind() + " not support"); } } else if (sqlNode instanceof SqlIdentifier) { list.add(((SqlIdentifier) sqlNode).getSimple()); } else { throw new RuntimeException("operator " + sqlNode.getClass() + " not support"); } return list; } -- Sent from: http://apache-flink.147419.n8.nabble.com/ |
In reply to this post by Harold.Miao
我写过一个类似的可以参考一下
private static List<String> lookupSelectTable(SqlNode sqlNode) { List<String> list = new ArrayList<>(); if (sqlNode instanceof SqlSelect) { SqlNode from = ((SqlSelect) sqlNode).getFrom(); list.addAll(lookupSelectTable(from)); } else if (sqlNode instanceof SqlJoin) { SqlJoin sqlJoin = (SqlJoin) sqlNode; list.addAll(lookupSelectTable(sqlJoin.getLeft())); list.addAll(lookupSelectTable(sqlJoin.getRight())); } else if (sqlNode instanceof SqlBasicCall) { SqlBasicCall sqlBasicCall = (SqlBasicCall) sqlNode; SqlOperator operator = sqlBasicCall.getOperator(); if (SqlKind.AS.equals(operator.getKind())) { list.addAll(lookupSelectTable(sqlBasicCall.getOperands()[0])); } else if (SqlKind.UNION.equals(operator.getKind())) { for (SqlNode operandSqlNode : sqlBasicCall.getOperands()) { list.addAll(lookupSelectTable(operandSqlNode)); } } else { throw new RuntimeException("operator " + operator.getKind() + " not support"); } } else if (sqlNode instanceof SqlIdentifier) { list.add(((SqlIdentifier) sqlNode).getSimple()); } else { throw new RuntimeException("operator " + sqlNode.getClass() + " not support"); } return list; } -- Sent from: http://apache-flink.147419.n8.nabble.com/ |
In reply to this post by silence-2
thx
silence <[hidden email]> 于2020年9月22日周二 上午11:54写道: > 写过一个类似的可以参考一下 > > private static List<String> lookupSelectTable(SqlNode sqlNode) { > List<String> list = new ArrayList<>(); > if (sqlNode instanceof SqlSelect) { > SqlNode from = ((SqlSelect) sqlNode).getFrom(); > list.addAll(lookupSelectTable(from)); > } else if (sqlNode instanceof SqlJoin) { > SqlJoin sqlJoin = (SqlJoin) sqlNode; > list.addAll(lookupSelectTable(sqlJoin.getLeft())); > list.addAll(lookupSelectTable(sqlJoin.getRight())); > } else if (sqlNode instanceof SqlBasicCall) { > SqlBasicCall sqlBasicCall = (SqlBasicCall) sqlNode; > SqlOperator operator = sqlBasicCall.getOperator(); > if (SqlKind.AS.equals(operator.getKind())) { > > list.addAll(lookupSelectTable(sqlBasicCall.getOperands()[0])); > } else if (SqlKind.UNION.equals(operator.getKind())) { > for (SqlNode operandSqlNode : sqlBasicCall.getOperands()) { > list.addAll(lookupSelectTable(operandSqlNode)); > } > } else { > throw new RuntimeException("operator " + operator.getKind() > + " not support"); > } > } else if (sqlNode instanceof SqlIdentifier) { > list.add(((SqlIdentifier) sqlNode).getSimple()); > } else { > throw new RuntimeException("operator " + sqlNode.getClass() + " > not support"); > } > return list; > } > > > > -- > Sent from: http://apache-flink.147419.n8.nabble.com/ > -- Best Regards, Harold Miao |
Free forum by Nabble | Edit this page |