Re: [SQL] parse table name from sql statement

2020-09-22 文章 Harold.Miao
thx

silence  于2020年9月22日周二 上午11:54写道:

> 写过一个类似的可以参考一下
>
> private static List lookupSelectTable(SqlNode sqlNode) {
> List 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


Re: [SQL] parse table name from sql statement

2020-09-21 文章 silence
我写过一个类似的可以参考一下

private static List lookupSelectTable(SqlNode sqlNode) {
List 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/


Re: [SQL] parse table name from sql statement

2020-09-21 文章 silence
写过一个类似的可以参考一下

private static List lookupSelectTable(SqlNode sqlNode) {
List 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/


Re: Re: [SQL] parse table name from sql statement

2020-09-21 文章 Harold.Miao
大佬  能不能给点示例

Benchao Li  于2020年9月21日周一 下午4:38写道:

> 我感觉可以先把SQL转成RelNode,然后用Calcite的visitor模式的RelShuttle来获取?
>
> Harold.Miao  于2020年9月21日周一 下午1:58写道:
>
> > 主要是我没有完整的所有单元case, 总是感觉写的不完整。
> >
> > 郭士榕  于2020年9月21日周一 上午11:08写道:
> >
> > >
> > >
> > >
> > > 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > 在 2020-09-21 10:50:31,"Harold.Miao"  写道:
> > > >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
> > > >
> > > >郭士榕  于2020年9月21日周一 上午10:21写道:
> > > >
> > > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
> > > >>
> > > >>
> > > >>
> > > >>
> > > >>
> > > >> 在 2020-09-21 10:12:13,"Harold.Miao"  写道:
> > > >> >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


Re: Re: [SQL] parse table name from sql statement

2020-09-21 文章 Benchao Li
我感觉可以先把SQL转成RelNode,然后用Calcite的visitor模式的RelShuttle来获取?

Harold.Miao  于2020年9月21日周一 下午1:58写道:

> 主要是我没有完整的所有单元case, 总是感觉写的不完整。
>
> 郭士榕  于2020年9月21日周一 上午11:08写道:
>
> >
> >
> >
> > 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > 在 2020-09-21 10:50:31,"Harold.Miao"  写道:
> > >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
> > >
> > >郭士榕  于2020年9月21日周一 上午10:21写道:
> > >
> > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
> > >>
> > >>
> > >>
> > >>
> > >>
> > >> 在 2020-09-21 10:12:13,"Harold.Miao"  写道:
> > >> >hi all
> > >> >
> > >> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。
> > >> >
> > >> >谢谢
> > >> >
> > >> >--
> > >> >
> > >> >Best Regards,
> > >> >Harold Miao
> > >>
> > >
> > >
> > >--
> > >
> > >Best Regards,
> > >Harold Miao
> >
>
>
> --
>
> Best Regards,
> Harold Miao
>


-- 

Best,
Benchao Li


Re: Re: [SQL] parse table name from sql statement

2020-09-20 文章 Harold.Miao
主要是我没有完整的所有单元case, 总是感觉写的不完整。

郭士榕  于2020年9月21日周一 上午11:08写道:

>
>
>
> 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> 在 2020-09-21 10:50:31,"Harold.Miao"  写道:
> >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
> >
> >郭士榕  于2020年9月21日周一 上午10:21写道:
> >
> >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
> >>
> >>
> >>
> >>
> >>
> >> 在 2020-09-21 10:12:13,"Harold.Miao"  写道:
> >> >hi all
> >> >
> >> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。
> >> >
> >> >谢谢
> >> >
> >> >--
> >> >
> >> >Best Regards,
> >> >Harold Miao
> >>
> >
> >
> >--
> >
> >Best Regards,
> >Harold Miao
>


-- 

Best Regards,
Harold Miao


Re: [SQL] parse table name from sql statement

2020-09-20 文章 Harold.Miao
主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。

郭士榕  于2020年9月21日周一 上午10:21写道:

> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
>
>
>
>
>
> 在 2020-09-21 10:12:13,"Harold.Miao"  写道:
> >hi all
> >
> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。
> >
> >谢谢
> >
> >--
> >
> >Best Regards,
> >Harold Miao
>


-- 

Best Regards,
Harold Miao


Re:[SQL] parse table name from sql statement

2020-09-20 文章 郭士榕
可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。





在 2020-09-21 10:12:13,"Harold.Miao"  写道:
>hi all
>
>请教大家在复杂sql语句中parse所有的table name是怎么实现的。
>
>谢谢
>
>-- 
>
>Best Regards,
>Harold Miao