[SQL] parse table name from sql statement

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

[SQL] parse table name from sql statement

Harold.Miao
hi all

请教大家在复杂sql语句中parse所有的table name是怎么实现的。

谢谢

--

Best Regards,
Harold Miao
Reply | Threaded
Open this post in threaded view
|

Re:[SQL] parse table name from sql statement

gsralex
可以使用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
Reply | Threaded
Open this post in threaded view
|

Re: [SQL] parse table name from sql statement

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
Reply | Threaded
Open this post in threaded view
|

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

gsralex



就是要一个一个判断做解析下推的,比如你举的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
Reply | Threaded
Open this post in threaded view
|

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

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
Reply | Threaded
Open this post in threaded view
|

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

Benchao Li-2
我感觉可以先把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
Reply | Threaded
Open this post in threaded view
|

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

Harold.Miao
大佬  能不能给点示例

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
Reply | Threaded
Open this post in threaded view
|

Re: [SQL] parse table name from sql statement

silence-2
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/
Reply | Threaded
Open this post in threaded view
|

Re: [SQL] parse table name from sql statement

silence-2
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/
Reply | Threaded
Open this post in threaded view
|

Re: [SQL] parse table name from sql statement

Harold.Miao
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