You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by "Harold.Miao" <mi...@gmail.com> on 2020/09/21 02:12:13 UTC
[SQL] parse table name from sql statement
hi all
请教大家在复杂sql语句中parse所有的table name是怎么实现的。
谢谢
--
Best Regards,
Harold Miao
Re: Re: [SQL] parse table name from sql statement
Posted by "Harold.Miao" <mi...@gmail.com>.
大佬 能不能给点示例
Benchao Li <li...@apache.org> 于2020年9月21日周一 下午4:38写道:
> 我感觉可以先把SQL转成RelNode,然后用Calcite的visitor模式的RelShuttle来获取?
>
> Harold.Miao <mi...@gmail.com> 于2020年9月21日周一 下午1:58写道:
>
> > 主要是我没有完整的所有单元case, 总是感觉写的不完整。
> >
> > 郭士榕 <gs...@163.com> 于2020年9月21日周一 上午11:08写道:
> >
> > >
> > >
> > >
> > > 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > 在 2020-09-21 10:50:31,"Harold.Miao" <mi...@gmail.com> 写道:
> > > >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
> > > >
> > > >郭士榕 <gs...@163.com> 于2020年9月21日周一 上午10:21写道:
> > > >
> > > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
> > > >>
> > > >>
> > > >>
> > > >>
> > > >>
> > > >> 在 2020-09-21 10:12:13,"Harold.Miao" <mi...@gmail.com> 写道:
> > > >> >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
Posted by Benchao Li <li...@apache.org>.
我感觉可以先把SQL转成RelNode,然后用Calcite的visitor模式的RelShuttle来获取?
Harold.Miao <mi...@gmail.com> 于2020年9月21日周一 下午1:58写道:
> 主要是我没有完整的所有单元case, 总是感觉写的不完整。
>
> 郭士榕 <gs...@163.com> 于2020年9月21日周一 上午11:08写道:
>
> >
> >
> >
> > 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > 在 2020-09-21 10:50:31,"Harold.Miao" <mi...@gmail.com> 写道:
> > >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
> > >
> > >郭士榕 <gs...@163.com> 于2020年9月21日周一 上午10:21写道:
> > >
> > >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
> > >>
> > >>
> > >>
> > >>
> > >>
> > >> 在 2020-09-21 10:12:13,"Harold.Miao" <mi...@gmail.com> 写道:
> > >> >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
Posted by "Harold.Miao" <mi...@gmail.com>.
主要是我没有完整的所有单元case, 总是感觉写的不完整。
郭士榕 <gs...@163.com> 于2020年9月21日周一 上午11:08写道:
>
>
>
> 就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> 在 2020-09-21 10:50:31,"Harold.Miao" <mi...@gmail.com> 写道:
> >主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
> >
> >郭士榕 <gs...@163.com> 于2020年9月21日周一 上午10:21写道:
> >
> >> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
> >>
> >>
> >>
> >>
> >>
> >> 在 2020-09-21 10:12:13,"Harold.Miao" <mi...@gmail.com> 写道:
> >> >hi all
> >> >
> >> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。
> >> >
> >> >谢谢
> >> >
> >> >--
> >> >
> >> >Best Regards,
> >> >Harold Miao
> >>
> >
> >
> >--
> >
> >Best Regards,
> >Harold Miao
>
--
Best Regards,
Harold Miao
Re:Re: [SQL] parse table name from sql statement
Posted by 郭士榕 <gs...@163.com>.
就是要一个一个判断做解析下推的,比如你举的SqlJoin例子, 然后继续left,right下推。
在 2020-09-21 10:50:31,"Harold.Miao" <mi...@gmail.com> 写道:
>主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
>
>郭士榕 <gs...@163.com> 于2020年9月21日周一 上午10:21写道:
>
>> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
>>
>>
>>
>>
>>
>> 在 2020-09-21 10:12:13,"Harold.Miao" <mi...@gmail.com> 写道:
>> >hi all
>> >
>> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。
>> >
>> >谢谢
>> >
>> >--
>> >
>> >Best Regards,
>> >Harold Miao
>>
>
>
>--
>
>Best Regards,
>Harold Miao
Re: [SQL] parse table name from sql statement
Posted by "Harold.Miao" <mi...@gmail.com>.
主要是嵌套回溯特别复杂, 例如getFrom之后后面可能又是嵌套一个SqlJoin等等类似情况太多。 还有要做很多的类型转换。
郭士榕 <gs...@163.com> 于2020年9月21日周一 上午10:21写道:
> 可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
>
>
>
>
>
> 在 2020-09-21 10:12:13,"Harold.Miao" <mi...@gmail.com> 写道:
> >hi all
> >
> >请教大家在复杂sql语句中parse所有的table name是怎么实现的。
> >
> >谢谢
> >
> >--
> >
> >Best Regards,
> >Harold Miao
>
--
Best Regards,
Harold Miao
Re:[SQL] parse table name from sql statement
Posted by 郭士榕 <gs...@163.com>.
可以使用calcite。解析kind为CREATE_TABLE的语句,解析INSERT,下推from的表。
在 2020-09-21 10:12:13,"Harold.Miao" <mi...@gmail.com> 写道:
>hi all
>
>请教大家在复杂sql语句中parse所有的table name是怎么实现的。
>
>谢谢
>
>--
>
>Best Regards,
>Harold Miao
Re: [SQL] parse table name from sql statement
Posted by silence <sl...@aliyun.com.INVALID>.
我写过一个类似的可以参考一下
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/
Re: [SQL] parse table name from sql statement
Posted by "Harold.Miao" <mi...@gmail.com>.
thx
silence <sl...@aliyun.com.invalid> 于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
Re: [SQL] parse table name from sql statement
Posted by silence <sl...@aliyun.com.INVALID>.
写过一个类似的可以参考一下
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/