亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

trino語義分析

2024-07-24 09:43:42
15
0

語義分析


問題


  • 為什么要有語義分析

SQL(Structured Query Language)的語義分析目的是確保查詢語句的語法正確,同時也驗證查詢的語義是否合法,以便數據庫系統能夠正確執行這些查詢。語義分析的主要目標包括:

  1. 語法驗證: 首先,語義分析會驗證 SQL 查詢的語法是否正確。這包括檢查查詢中的關鍵字、標識符、操作符等是否按照 SQL 語法規則排列正確。
  2. 數據表和列驗證: 語義分析會檢查查詢中引用的數據表和列是否存在于數據庫中。這是為了確保查詢操作的對象在數據庫中是有效的。
  3. 數據類型匹配: 確保查詢中的各種操作符、函數和表達式的數據類型是兼容的。例如,不允許將字符串和數字相加,因此語義分析會檢查這些數據類型是否匹配。
  4. 權限驗證: 確保查詢執行者有足夠的權限來執行所提交的查詢。這包括對數據表的讀取、寫入、刪除等權限的驗證。
  5. 查詢合法性: 確保查詢的語義合法,不會導致歧義或不一致的結果。例如,不允許在同一查詢中使用聚合函數和非聚合列,因為這可能會導致不確定的結果。
  6. 優化準備: 在語義分析階段,數據庫系統還可以根據查詢的語義信息為查詢生成執行計劃。這個執行計劃將決定查詢的最佳執行方式,以提高查詢性能。

總的來說,語義分析是確保 SQL 查詢在數據庫中正確執行的關鍵步驟。它有助于防止錯誤的查詢進入數據庫系統,同時也為執行查詢提供了必要的信息和準備工作。這有助于提高數據庫系統的穩定性、安全性和性能。
image.png

注意,我這里只是修改了列名,所以語法分析時不會報錯。如果將from修改為to,在語法分析階段就會報錯,因為語法文件并沒有對to進行定義。

  • 語義分析的作用

遍歷SQL AST,將AST中表達的含義,拆解為多個Map結構以便后續生成執行計劃時,不再頻繁需要遍歷SQL AST。同時還去獲取了表和字段的元數據,生成了對應的ConnectorTableHandle, ColumnHandle等與數據源Connector相關的對象實例,也是為了之后拿來即用。在此過程中生成的所有對象,都維護在一個實例化的Analysis對象中,你可以把它理解為是一個Context對象。(如果還是不明白Analysis是什么意思,可以直接看看Analysis.java的源碼)

源碼閱讀

會根據sql類型選取執行的sqlQueryExecution,主要分為DataDefinitionExecutionFactory和SqlQueryExecutionFactory。其中DataDefinitionExecutionFactory不會進行語義分析。

image.png

語義分析在上圖的queryExecutionFactory.createQueryExecution()就會進行創建,接下來看下具體怎么分析的。
image.png

最終會調用如下方法,并返回analysis

//io.trino.sql.analyzer.Analyzer

public Analysis analyze(Statement statement, QueryType queryType)
    {
        //對statement進行重寫,只有5種rewrites,如果statement是這5種類型就會重寫
        //比如show tables就會被重寫     
        Statement rewrittenStatement = statementRewrite.rewrite(analyzerFactory, session, statement, parameters, parameterLookup, warningCollector, planOptimizersStatsCollector);
        Analysis analysis = new Analysis(rewrittenStatement, parameterLookup, queryType);
        StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED);

        try (var ignored = scopedSpan(tracer, "analyze")) {
            //在這里對rewrittenStatement進行分析,就是遍歷SQL AST,將AST中表達的含義,拆解為多個
            //Map結構以便后續生成執行計劃時,不再頻繁需要遍歷SQL AST
            analyzer.analyze(rewrittenStatement);
        }

        try (var ignored = scopedSpan(tracer, "access-control")) {
            // check column access permissions for each table
            analysis.getTableColumnReferences().forEach((accessControlInfo, tableColumnReferences) ->
                    tableColumnReferences.forEach((tableName, columns) ->
                            accessControlInfo.getAccessControl().checkCanSelectFromColumns(
                                    accessControlInfo.getSecurityContext(session.getRequiredTransactionId(), session.getQueryId()),
                                    tableName,
                                    columns)));
        }

        return analysis;
    }

5種重寫的rewrites
image.png

analyzer.analyzer(rewrittenStatement)最終會對AST進行visit訪問
image.png

StatementAnalyzer中有個內部類Visitor,其繼承了io.trino.sql.tree.AstVisitor,重寫了其中的visit方法

image.png

在visit方法中對analysis(就是個map)進行賦值

image.png

0條評論
0 / 1000
c****g
3文章數
0粉絲數
c****g
3 文章 | 0 粉絲
c****g
3文章數
0粉絲數
c****g
3 文章 | 0 粉絲
原創

trino語義分析

2024-07-24 09:43:42
15
0

語義分析


問題


  • 為什么要有語義分析

SQL(Structured Query Language)的語義分析目的是確保查詢語句的語法正確,同時也驗證查詢的語義是否合法,以便數據庫系統能夠正確執行這些查詢。語義分析的主要目標包括:

  1. 語法驗證: 首先,語義分析會驗證 SQL 查詢的語法是否正確。這包括檢查查詢中的關鍵字、標識符、操作符等是否按照 SQL 語法規則排列正確。
  2. 數據表和列驗證: 語義分析會檢查查詢中引用的數據表和列是否存在于數據庫中。這是為了確保查詢操作的對象在數據庫中是有效的。
  3. 數據類型匹配: 確保查詢中的各種操作符、函數和表達式的數據類型是兼容的。例如,不允許將字符串和數字相加,因此語義分析會檢查這些數據類型是否匹配。
  4. 權限驗證: 確保查詢執行者有足夠的權限來執行所提交的查詢。這包括對數據表的讀取、寫入、刪除等權限的驗證。
  5. 查詢合法性: 確保查詢的語義合法,不會導致歧義或不一致的結果。例如,不允許在同一查詢中使用聚合函數和非聚合列,因為這可能會導致不確定的結果。
  6. 優化準備: 在語義分析階段,數據庫系統還可以根據查詢的語義信息為查詢生成執行計劃。這個執行計劃將決定查詢的最佳執行方式,以提高查詢性能。

總的來說,語義分析是確保 SQL 查詢在數據庫中正確執行的關鍵步驟。它有助于防止錯誤的查詢進入數據庫系統,同時也為執行查詢提供了必要的信息和準備工作。這有助于提高數據庫系統的穩定性、安全性和性能。
image.png

注意,我這里只是修改了列名,所以語法分析時不會報錯。如果將from修改為to,在語法分析階段就會報錯,因為語法文件并沒有對to進行定義。

  • 語義分析的作用

遍歷SQL AST,將AST中表達的含義,拆解為多個Map結構以便后續生成執行計劃時,不再頻繁需要遍歷SQL AST。同時還去獲取了表和字段的元數據,生成了對應的ConnectorTableHandle, ColumnHandle等與數據源Connector相關的對象實例,也是為了之后拿來即用。在此過程中生成的所有對象,都維護在一個實例化的Analysis對象中,你可以把它理解為是一個Context對象。(如果還是不明白Analysis是什么意思,可以直接看看Analysis.java的源碼)

源碼閱讀

會根據sql類型選取執行的sqlQueryExecution,主要分為DataDefinitionExecutionFactory和SqlQueryExecutionFactory。其中DataDefinitionExecutionFactory不會進行語義分析。

image.png

語義分析在上圖的queryExecutionFactory.createQueryExecution()就會進行創建,接下來看下具體怎么分析的。
image.png

最終會調用如下方法,并返回analysis

//io.trino.sql.analyzer.Analyzer

public Analysis analyze(Statement statement, QueryType queryType)
    {
        //對statement進行重寫,只有5種rewrites,如果statement是這5種類型就會重寫
        //比如show tables就會被重寫     
        Statement rewrittenStatement = statementRewrite.rewrite(analyzerFactory, session, statement, parameters, parameterLookup, warningCollector, planOptimizersStatsCollector);
        Analysis analysis = new Analysis(rewrittenStatement, parameterLookup, queryType);
        StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED);

        try (var ignored = scopedSpan(tracer, "analyze")) {
            //在這里對rewrittenStatement進行分析,就是遍歷SQL AST,將AST中表達的含義,拆解為多個
            //Map結構以便后續生成執行計劃時,不再頻繁需要遍歷SQL AST
            analyzer.analyze(rewrittenStatement);
        }

        try (var ignored = scopedSpan(tracer, "access-control")) {
            // check column access permissions for each table
            analysis.getTableColumnReferences().forEach((accessControlInfo, tableColumnReferences) ->
                    tableColumnReferences.forEach((tableName, columns) ->
                            accessControlInfo.getAccessControl().checkCanSelectFromColumns(
                                    accessControlInfo.getSecurityContext(session.getRequiredTransactionId(), session.getQueryId()),
                                    tableName,
                                    columns)));
        }

        return analysis;
    }

5種重寫的rewrites
image.png

analyzer.analyzer(rewrittenStatement)最終會對AST進行visit訪問
image.png

StatementAnalyzer中有個內部類Visitor,其繼承了io.trino.sql.tree.AstVisitor,重寫了其中的visit方法

image.png

在visit方法中對analysis(就是個map)進行賦值

image.png

文章來自個人專欄
文章 | 訂閱
0條評論
0 / 1000
請輸入你的評論
0
0