<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文走進SQL編譯-語義解析

OSC開源社區 ? 來源:KaiwuDB ? 2023-06-18 10:46 ? 次閱讀

一、概述

SQL 引擎主要由三大部分構成:解析器、優化器和執行器。

解析器的主要作用是將客戶端傳來的命令解析編譯成數據庫能識別運行的命令,其主要由詞法解析、語法解析和語義解析三部分構成,如下圖所示。

e903d308-0c36-11ee-962d-dac502259ad0.png ?

本文將重點介紹 KaiwuDB 語義解析部分,其輸入為 AST 語法樹,輸出為可供優化器使用的 Expr 表達式。

KaiwuDB 中的語義解析主要包括:

檢查數據庫或表是否存在

檢查語句所需的特定權限

對語句中的表達式進行語義解析

檢查 DDL 語句所請求的 schema change 的有效性

二、語義解析

e917fe78-0c36-11ee-962d-dac502259ad0.png ?

KaiwuDB 中的語義解析主要包括以下流程:

檢查查詢是否為 SQL 語言中的有效語句

解析名稱,例如表名或變量名的值

消除不必要的中間計算,例如用 1.0 替換 0.6 + 0.4,這也被稱為常數折疊

確定用于中間結果的數據類型

其代碼流程介于 parser 和 memo 構建之間,將 parser 輸出的 AST 中的對象進行語義解析,語義解析的輸出作為 memo 構建的輸入。

接下來,將重點介紹查詢語句的語義解析流程:

Source and target analysis (目標解析)

Permission check (權限校驗)

Semanticdecomposition & validation (表達式拆分及其語義解析)

e92e5fa6-0c36-11ee-962d-dac502259ad0.png ?

1. 目標解析及權限校驗

1)接口路徑:

buildStmt() -> buildSelectStmtWithoutParent() -> buildSelectClause() -> builtFrom() -> buildDataSource()

2)核心接口為:

e94b4d14-0c36-11ee-962d-dac502259ad0.png ?

ResolveDataSource 通過 object name 解析出對象描述符(元數據),Privilege check 使用 current username 來校驗當前用戶對該對象是否有相應權限。

在完成目標解析和權限校驗后,會為 select stmt 中的 from clause 構建 memo 表達式。這個行為看似不是語義解析應該做的,出現在這里的原因是 KaiwuDB 的語義解析和部分邏輯計劃優化是相互融合的。

2. 表達式拆分及其語義解析

1)接口路徑:

buildStmt() -> buildSelectStmtWithoutParent() -> buildSelectClause()

KaiwuDB 將 select stmt 中的各個部分拆分為表達式,并對其進行標量表達式的語義解析,從而完成 scalarExpr 的構建。例如:

e961648c-0c36-11ee-962d-dac502259ad0.png ?

2)標量表達式語義解析:

ROLE:檢查表達式是否合法,為其做一些初步的優化,為其賦予類型。

INTERFACE

in : Expr

out : TypedExpr

實質上是檢查并賦予類型 + 簡化表達式

AnalyzeExpr()

HOW

i. Name Resolution

ii. TypeCheck

iii. Normalize Expr

這些子任務實現幾乎是純粹的函數,唯一的缺陷是, TypeCheck 將 SQL 占位符($1、$2 等)的類型以一種對順序敏感的方式,輸出到通過遞歸傳遞的語義環境對象上。

注意:可以使用 EXPLAIN(EXPRS, TYPES) 來檢查表達式,而不進行解構和簡化。

i. Name Resolution

e96a5a7e-0c36-11ee-962d-dac502259ad0.png ? e9881712-0c36-11ee-962d-dac502259ad0.png ?

參數 sources 和 IndexedVars,如果都不是 nil,則表示 resolveNames 應該被執行。IndexedVars map 將被填充并且作為結果返回。

用 parser.IndexedVar 實例替換列名

用 parser.FuncDef 引用替換函數名

ii. TypeCheck

parser.TypeCheck() / parser.TypeCheckAndRequire():

常數折疊

類型推斷

類型檢查

在 ComparisonExpr 節點上記憶比較器函數

用其類型來注釋表達式和占位符

實現 Expr 接口的表達式有很多:AndExpr, OrExpr, CastExpr, CaseExpr 等。

每個表達式都實現了 TypeCheck 接口,在被調用時返回結果表達式的類型,包括bool, string, int 等。

iii. Normalize parser.NormalizeExpr():

注意:此處的 normalize 有點不太準確,因為他并沒有進行標準的 normalize,這里只是將除變量名以外的東西都放到比較符號的右側,從而達到簡化的目的。

Normalize Example:

(a+1) < 3 is transformed to a < 2

-(a - b) is transformed to (b - a)

a between c and d is transformed to a >= c and a <= d

e9a95ba2-0c36-11ee-962d-dac502259ad0.png ?

Normalize 的實現主要依靠 WalkExpr 函數。WalkExpr 會橫穿 Expr,其通過傳入對應的 visitor 來定義 WalkExpr 的具體行為,前面講到的 name resolution 也是通過傳入 name resolution visitor 實現的。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 比較器
    +關注

    關注

    14

    文章

    1547

    瀏覽量

    106611
  • SQL
    SQL
    +關注

    關注

    1

    文章

    740

    瀏覽量

    43547
  • DDL
    DDL
    +關注

    關注

    0

    文章

    11

    瀏覽量

    6293
  • AST
    AST
    +關注

    關注

    0

    文章

    7

    瀏覽量

    2291

原文標題:一文走進SQL編譯-語義解析

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數據庫SQL的優化

    數據庫執行SQL都會先進行語義解析,然后將SQL分成一步一步可執行的計劃,然后逐步執行。通過分析執行計劃,我們可以清晰的看到數據庫執行的操作,這對于數據庫
    的頭像 發表于 10-09 15:43 ?820次閱讀
    數據庫<b class='flag-5'>SQL</b>的優化

    光耦PC817中解析

    光耦PC817中解析
    發表于 08-20 14:32

    手寫SQL編譯器詞法分析

    精讀《手寫 SQL 編譯器 - 詞法分析》
    發表于 05-26 16:27

    手寫SQL編譯器——文法介紹

    精讀《手寫 SQL 編譯器 - 文法介紹》
    發表于 05-29 13:35

    區分SQL語句與主語言語句

    編譯程序編譯處理目標語言程序主語言訪問數據庫基本步驟:第步:打開數據庫第二步:定義必要的主變量和數據通信去第三步:用SQL訪問數據庫,并對返回結果進行處理第四步:關閉數據庫...
    發表于 10-28 08:44

    為什么要動態sql語句?

    為什么要動態sql語句?因為動態sql語句能夠提供些比較友好的機制1、可以使得些在編譯過程中無法獲得完整的
    發表于 12-20 06:00

    SQL編程技術的特點有哪些

    SQL編程技術可以有效的克服SQL語言實現復雜應用方面的不足,提高應用系統和數據管理系統間的互操作性。SQL的特點之是在交互式和嵌入式二種不同的使用方式下,
    發表于 12-22 07:04

    SQL相關知識解析SQL完全手冊的免費分享

    本文介紹了SQL的基礎知識、SQL快速入門及SQL編程手冊的分享。
    發表于 11-22 11:31 ?0次下載
    <b class='flag-5'>SQL</b>相關知識<b class='flag-5'>解析</b>及<b class='flag-5'>SQL</b>完全手冊的免費分享

    解析編譯原理

    學過編譯原理課程的同學應該有體會,各種文法、各種詞法語法分析算法,非常消磨人的耐心和興致;中間代碼生成和優化,其實在很多應用場景下并不重要(當然這一塊對于“編譯原理”很重要);語義分析要處理很多很多細節,特別對于比較復雜的語言;
    發表于 11-24 09:28 ?3.4w次閱讀
    <b class='flag-5'>解析</b><b class='flag-5'>編譯</b>原理

    java的動態SQL詳細資料說明

    首先,所謂SQL的動態和靜態,是指SQL語句在何時被編譯和執行,二者都是用在SQL嵌入式編程中的,這里所說的嵌入式是指將SQL語句嵌入在高級
    發表于 06-06 17:51 ?0次下載
    java的動態<b class='flag-5'>SQL</b>詳細資料說明

    嵌入式SQL語句

    為了區分SQL語句與主語言語句,所有SQL 語句必須加前綴EXEC SQL處理過程:含嵌入式SQL語句的主語言程序預編譯程序轉換嵌入式
    發表于 10-21 11:51 ?4次下載
    嵌入式<b class='flag-5'>SQL</b>語句

    嵌入式SQL

    1嵌入式SQL嵌入式SQL是指將SQL語言嵌入到程序設計語言中,被嵌入得程序設計語言如C、C++、java等稱為宿主語言預編譯:由數據庫管理系統得預處理程序隊源程序進行掃描,識別出嵌入
    發表于 11-04 09:21 ?17次下載
    嵌入式<b class='flag-5'>SQL</b>

    Java中如何解析、格式化、生成SQL語句?

    昨天在群里看到有小伙伴問,Java里如何解析SQL語句然后格式化SQL,是否有現成類庫可以使用?
    的頭像 發表于 04-10 11:59 ?655次閱讀

    sql where條件的執行順序

    。 在深入討論WHERE條件的執行順序之前,先回顧一下一般SQL語句的執行順序。一條SQL語句的執行通??梢苑譃橐韵聨讉€步驟:解析器分析語法、語義校驗、查詢優化器生成執行計劃、執行計劃
    的頭像 發表于 11-23 11:31 ?1203次閱讀

    oracle執行sql查詢語句的步驟是什么

    Oracle數據庫是一種常用的關系型數據庫管理系統,具有強大的SQL查詢功能。Oracle執行SQL查詢語句的步驟包括編寫SQL語句、解析SQL
    的頭像 發表于 12-06 10:49 ?508次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>