searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

【源码阅读】2. Catalog和Database

2023-06-01 02:05:01
15
0

Catalog

创建

| KW_CREATE KW_CATALOG opt_if_not_exists:ifNotExists ident:catalogName opt_properties:properties
{:
RESULT = new CreateCatalogStmt(ifNotExists, catalogName, null, properties);
:}
| KW_CREATE KW_CATALOG opt_if_not_exists:ifNotExists ident:catalogName KW_WITH KW_RESOURCE ident:resourceName opt_properties:properties
{:
RESULT = new CreateCatalogStmt(ifNotExists, catalogName, resourceName, properties);
:}

可以通过两种方式建立Catalog

-- 方式一 
CREATE RESOURCE mysql_resource PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3316/doris_test?useSSL=false",
    "driver_url" = "https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
);
CREATE CATALOG jdbc WITH RESOURCE mysql_resource;

-- 方式二
CREATE CATALOG jdbc PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3316/doris_test?useSSL=false",
    "driver_url" = "https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
);
 

展示

Show Catalog有两种写法,分别展示所有Catalog列表和单Catalog的属性

 

展示创建

ShowCreateCatalogStmt在CatalogMgr.showCreateCatalog中拼接show create catalog语句

switch

最终设置ConnectContext.defaultCatalog属性

refresh

刷新Catalog时:

  • 重置objectCreated - 因为每一步操作都会先去makeSureInitialized,其中会判断objectCreated,这里设置了之后,后面会触发客户端创建
  • 重置initialized - 因为每一步操作都会先去makeSureInitialized,其中会判断initialized,这里设置了之后,后面会触发ExternalDatabase的生成(重置)
  • 清空Cache
    public void setUninitialized(boolean invalidCache) {
        this.objectCreated = false;
        this.initialized = false;
        this.invalidCacheInInit = invalidCache;
        if (invalidCache) {
            Env.getCurrentEnv().getExtMetaCacheMgr().invalidateCatalogCache(id);
        }
    }

Catalog接口调用

Catalog在实际进行接口调用时,会首先makeSureInitialized,判断objectCreated和initialized,保证以下事情是完成的:

  • 构建Client
  • 刷新DB列表

DB

创建

    KW_CREATE KW_DATABASE opt_if_not_exists:ifNotExists ident:db opt_properties:properties
    {:
        RESULT = new CreateDbStmt(ifNotExists, db, properties);
    :}

主要是InternalCatalog.createDb:创建Database对象并注册到内存

展示

    | KW_DATABASES opt_wild_where
    {:
        RESULT = new ShowDbStmt(parser.wild, parser.where);
    :}
    | KW_DATABASES KW_FROM ident:catalogName
    {:
        RESULT = new ShowDbStmt(null, null, catalogName);
    :}

展示创建

use

这个语句比较特殊,没有走一般的Query子流程,而是在dispatch时,直接走到了handleInitDb里面。而且调用它时,还会顺带发送如下子句

  • SELECT DATABASE()
  • show databases
  • show tables
 

最终调用ConnectContext.setDatabase设置ConnectContext.currentDb属性

 

refresh Database

刷新Database时:

  • 重置initialized - 因为每一步操作都会先去makeSureInitialized,其中会判断initialized,这里设置了之后,后面会触发ExternalTable的生成
  • 清空DB Cache
 

    public void setUnInitialized(boolean invalidCache) {
        this.initialized = false;
        this.invalidCacheInInit = invalidCache;
        if (invalidCache) {
            Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(extCatalog.getId(), name);
        }
    }

Database接口调用

确保Catalog初始化以后,再调用Catalog接口

Database在实际进行接口调用时,会首先makeSureInitialized,判断Catalog.makeSureInitialized和initialized,保证以下事情是完成的:

  • Catalog初始化完成
    • 构建Client
    • 刷新DB列表
  • 刷新Table列表
 

0条评论
0 / 1000
x****m
5文章数
0粉丝数
x****m
5 文章 | 0 粉丝
原创

【源码阅读】2. Catalog和Database

2023-06-01 02:05:01
15
0

Catalog

创建

| KW_CREATE KW_CATALOG opt_if_not_exists:ifNotExists ident:catalogName opt_properties:properties
{:
RESULT = new CreateCatalogStmt(ifNotExists, catalogName, null, properties);
:}
| KW_CREATE KW_CATALOG opt_if_not_exists:ifNotExists ident:catalogName KW_WITH KW_RESOURCE ident:resourceName opt_properties:properties
{:
RESULT = new CreateCatalogStmt(ifNotExists, catalogName, resourceName, properties);
:}

可以通过两种方式建立Catalog

-- 方式一 
CREATE RESOURCE mysql_resource PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3316/doris_test?useSSL=false",
    "driver_url" = "https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
);
CREATE CATALOG jdbc WITH RESOURCE mysql_resource;

-- 方式二
CREATE CATALOG jdbc PROPERTIES (
    "type"="jdbc",
    "user"="root",
    "password"="123456",
    "jdbc_url" = "jdbc:mysql://127.0.0.1:3316/doris_test?useSSL=false",
    "driver_url" = "https://doris-community-test-1308700295.cos.ap-hongkong.myqcloud.com/jdbc_driver/mysql-connector-java-8.0.25.jar",
    "driver_class" = "com.mysql.cj.jdbc.Driver"
);
 

展示

Show Catalog有两种写法,分别展示所有Catalog列表和单Catalog的属性

 

展示创建

ShowCreateCatalogStmt在CatalogMgr.showCreateCatalog中拼接show create catalog语句

switch

最终设置ConnectContext.defaultCatalog属性

refresh

刷新Catalog时:

  • 重置objectCreated - 因为每一步操作都会先去makeSureInitialized,其中会判断objectCreated,这里设置了之后,后面会触发客户端创建
  • 重置initialized - 因为每一步操作都会先去makeSureInitialized,其中会判断initialized,这里设置了之后,后面会触发ExternalDatabase的生成(重置)
  • 清空Cache
    public void setUninitialized(boolean invalidCache) {
        this.objectCreated = false;
        this.initialized = false;
        this.invalidCacheInInit = invalidCache;
        if (invalidCache) {
            Env.getCurrentEnv().getExtMetaCacheMgr().invalidateCatalogCache(id);
        }
    }

Catalog接口调用

Catalog在实际进行接口调用时,会首先makeSureInitialized,判断objectCreated和initialized,保证以下事情是完成的:

  • 构建Client
  • 刷新DB列表

DB

创建

    KW_CREATE KW_DATABASE opt_if_not_exists:ifNotExists ident:db opt_properties:properties
    {:
        RESULT = new CreateDbStmt(ifNotExists, db, properties);
    :}

主要是InternalCatalog.createDb:创建Database对象并注册到内存

展示

    | KW_DATABASES opt_wild_where
    {:
        RESULT = new ShowDbStmt(parser.wild, parser.where);
    :}
    | KW_DATABASES KW_FROM ident:catalogName
    {:
        RESULT = new ShowDbStmt(null, null, catalogName);
    :}

展示创建

use

这个语句比较特殊,没有走一般的Query子流程,而是在dispatch时,直接走到了handleInitDb里面。而且调用它时,还会顺带发送如下子句

  • SELECT DATABASE()
  • show databases
  • show tables
 

最终调用ConnectContext.setDatabase设置ConnectContext.currentDb属性

 

refresh Database

刷新Database时:

  • 重置initialized - 因为每一步操作都会先去makeSureInitialized,其中会判断initialized,这里设置了之后,后面会触发ExternalTable的生成
  • 清空DB Cache
 

    public void setUnInitialized(boolean invalidCache) {
        this.initialized = false;
        this.invalidCacheInInit = invalidCache;
        if (invalidCache) {
            Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(extCatalog.getId(), name);
        }
    }

Database接口调用

确保Catalog初始化以后,再调用Catalog接口

Database在实际进行接口调用时,会首先makeSureInitialized,判断Catalog.makeSureInitialized和initialized,保证以下事情是完成的:

  • Catalog初始化完成
    • 构建Client
    • 刷新DB列表
  • 刷新Table列表
 

文章来自个人专栏
Doris
5 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0