Flink SQL 1.11.1 executeSql/SqlUpdate时 SQL validation的一些问题

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

Flink SQL 1.11.1 executeSql/SqlUpdate时 SQL validation的一些问题

刘首维

Hi all,


     今天在调试1.11 Flink 代码的时候,发现一个没太理解的现象


  考虑以下code 


 

  bsTableEnv.executeSql("create database a")
    bsTableEnv.executeSql( " CREATE TABLE  a.b "(后略))
    bsTableEnv.executeSql("select * from a.b")


然后发现了以下现象:


从图中可以得知,在`DatabaseCalciteSchema` 中
我发现下面几个奇怪的点
  1.  databaseName 是 ‘'default'
  2.  getTable将 `a`作为参数传入,而不是b (a是库名,b是表名)


首先可以确定的是这个发生在validation阶段

其次我发现特意针对这块做了一次catch `TableNotExistException`的操作

请问这部分代码的用途和目的是?



Reply | Threaded
Open this post in threaded view
|

Re: Flink SQL 1.11.1 executeSql/SqlUpdate时 SQL validation的一些问题

Benchao Li-2
我理解这个是calcite的机制导致的。calcite并不知道Flink一共有多少层schema,其实Flink
自己抽象了三层,也就是catalog.database.table
但是配置CalciteCatalogReader的时候,需要配置一些默认的schema查找规则,这个Flink是配置了两个,
也就是默认的catalog 和 默认的catalog+默认的database
然后calcite在查找的时候会先尝试default_catalog.default_database作为schema,去查找a.b,此时会先把a当做table去查找,并且找不到。
接下来会default_catalog作为schema去查找a.b,此时就找到了。

刘首维 <[hidden email]> 于2020年9月25日周五 下午3:41写道:

> Hi all,
>
>
>      今天在调试1.11 Flink 代码的时候,发现一个没太理解的现象
>
>
>   考虑以下code
>
>
>
>   bsTableEnv.executeSql("create database a")
>     bsTableEnv.executeSql( " CREATE TABLE  a.b "(后略))
>     bsTableEnv.executeSql("select * from a.b")
>
>
> 然后发现了以下现象:
>
>
> 从图中可以得知,在`DatabaseCalciteSchema` 中
> 我发现下面几个奇怪的点
>
>    1.  databaseName 是 ‘'default'
>    2.  getTable将 `a`作为参数传入,而不是b (a是库名,b是表名)
>
>
>
> 首先可以确定的是这个发生在validation阶段
>
> 其次我发现特意针对这块做了一次catch `TableNotExistException`的操作
>
> 请问这部分代码的用途和目的是?
>
>
>
>

--

Best,
Benchao Li