欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文走進(jìn)SQL編譯-語(yǔ)義解析

OSC開(kāi)源社區(qū) ? 來(lái)源:KaiwuDB ? 2023-06-18 10:46 ? 次閱讀

一、概述

SQL 引擎主要由三大部分構(gòu)成:解析器、優(yōu)化器和執(zhí)行器。

解析器的主要作用是將客戶端傳來(lái)的命令解析編譯成數(shù)據(jù)庫(kù)能識(shí)別運(yùn)行的命令,其主要由詞法解析、語(yǔ)法解析和語(yǔ)義解析三部分構(gòu)成,如下圖所示。

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

本文將重點(diǎn)介紹 KaiwuDB 語(yǔ)義解析部分,其輸入為 AST 語(yǔ)法樹(shù),輸出為可供優(yōu)化器使用的 Expr 表達(dá)式

KaiwuDB 中的語(yǔ)義解析主要包括:

檢查數(shù)據(jù)庫(kù)或表是否存在

檢查語(yǔ)句所需的特定權(quán)限

對(duì)語(yǔ)句中的表達(dá)式進(jìn)行語(yǔ)義解析

檢查 DDL 語(yǔ)句所請(qǐng)求的 schema change 的有效性

二、語(yǔ)義解析

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

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

檢查查詢是否為 SQL 語(yǔ)言中的有效語(yǔ)句

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

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

確定用于中間結(jié)果的數(shù)據(jù)類型

其代碼流程介于 parser 和 memo 構(gòu)建之間,將 parser 輸出的 AST 中的對(duì)象進(jìn)行語(yǔ)義解析,語(yǔ)義解析的輸出作為 memo 構(gòu)建的輸入。

接下來(lái),將重點(diǎn)介紹查詢語(yǔ)句的語(yǔ)義解析流程:

Source and target analysis (目標(biāo)解析)

Permission check (權(quán)限校驗(yàn))

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

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

1. 目標(biāo)解析及權(quán)限校驗(yàn)

1)接口路徑:

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

2)核心接口為:

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

ResolveDataSource 通過(guò) object name 解析出對(duì)象描述符(元數(shù)據(jù)),Privilege check 使用 current username 來(lái)校驗(yàn)當(dāng)前用戶對(duì)該對(duì)象是否有相應(yīng)權(quán)限。

在完成目標(biāo)解析和權(quán)限校驗(yàn)后,會(huì)為 select stmt 中的 from clause 構(gòu)建 memo 表達(dá)式。這個(gè)行為看似不是語(yǔ)義解析應(yīng)該做的,出現(xiàn)在這里的原因是 KaiwuDB 的語(yǔ)義解析和部分邏輯計(jì)劃優(yōu)化是相互融合的。

2. 表達(dá)式拆分及其語(yǔ)義解析

1)接口路徑:

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

KaiwuDB 將 select stmt 中的各個(gè)部分拆分為表達(dá)式,并對(duì)其進(jìn)行標(biāo)量表達(dá)式的語(yǔ)義解析,從而完成 scalarExpr 的構(gòu)建。例如:

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

2)標(biāo)量表達(dá)式語(yǔ)義解析:

ROLE:檢查表達(dá)式是否合法,為其做一些初步的優(yōu)化,為其賦予類型。

INTERFACE

in : Expr

out : TypedExpr

實(shí)質(zhì)上是檢查并賦予類型 + 簡(jiǎn)化表達(dá)式

AnalyzeExpr()

HOW

i. Name Resolution

ii. TypeCheck

iii. Normalize Expr

這些子任務(wù)實(shí)現(xiàn)幾乎是純粹的函數(shù),唯一的缺陷是, TypeCheck 將 SQL 占位符($1、$2 等)的類型以一種對(duì)順序敏感的方式,輸出到通過(guò)遞歸傳遞的語(yǔ)義環(huán)境對(duì)象上。

注意:可以使用 EXPLAIN(EXPRS, TYPES) 來(lái)檢查表達(dá)式,而不進(jìn)行解構(gòu)和簡(jiǎn)化。

i. Name Resolution

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

參數(shù) sources 和 IndexedVars,如果都不是 nil,則表示 resolveNames 應(yīng)該被執(zhí)行。IndexedVars map 將被填充并且作為結(jié)果返回。

用 parser.IndexedVar 實(shí)例替換列名

用 parser.FuncDef 引用替換函數(shù)名

ii. TypeCheck

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

常數(shù)折疊

類型推斷

類型檢查

在 ComparisonExpr 節(jié)點(diǎn)上記憶比較器函數(shù)

用其類型來(lái)注釋表達(dá)式和占位符

實(shí)現(xiàn) Expr 接口的表達(dá)式有很多:AndExpr, OrExpr, CastExpr, CaseExpr 等。

每個(gè)表達(dá)式都實(shí)現(xiàn)了 TypeCheck 接口,在被調(diào)用時(shí)返回結(jié)果表達(dá)式的類型,包括bool, string, int 等。

iii. Normalize parser.NormalizeExpr():

注意:此處的 normalize 有點(diǎn)不太準(zhǔn)確,因?yàn)樗](méi)有進(jìn)行標(biāo)準(zhǔn)的 normalize,這里只是將除變量名以外的東西都放到比較符號(hào)的右側(cè),從而達(dá)到簡(jiǎn)化的目的。

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 的實(shí)現(xiàn)主要依靠 WalkExpr 函數(shù)。WalkExpr 會(huì)橫穿 Expr,其通過(guò)傳入對(duì)應(yīng)的 visitor 來(lái)定義 WalkExpr 的具體行為,前面講到的 name resolution 也是通過(guò)傳入 name resolution visitor 實(shí)現(xiàn)的。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 比較器
    +關(guān)注

    關(guān)注

    14

    文章

    1659

    瀏覽量

    107456
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    775

    瀏覽量

    44272
  • DDL
    DDL
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    6352
  • AST
    AST
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    2341

原文標(biāo)題:一文走進(jìn)SQL編譯-語(yǔ)義解析

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)庫(kù)SQL的優(yōu)化

    數(shù)據(jù)庫(kù)執(zhí)行SQL都會(huì)先進(jìn)行語(yǔ)義解析,然后將SQL分成步可執(zhí)行的計(jì)劃,然后逐步執(zhí)行。通過(guò)分析
    的頭像 發(fā)表于 10-09 15:43 ?1103次閱讀
    數(shù)據(jù)庫(kù)<b class='flag-5'>SQL</b>的優(yōu)化

    手寫SQL編譯器詞法分析

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

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

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

    讀懂SQL Server和MySQL的區(qū)別

    SQL Server和MySQL的區(qū)別主要體現(xiàn)在下面這些方面: 、本質(zhì)區(qū)別是它們所遵循的基本原則 二、發(fā)行費(fèi)用上:MySQL不全是免費(fèi),但很便宜 三、性能方面:先進(jìn)的MySQL 四、安全功能 五、恢復(fù)性:先進(jìn)的SQL
    發(fā)表于 09-28 11:29 ?8.3w次閱讀

    SQL相關(guān)知識(shí)解析SQL完全手冊(cè)的免費(fèi)分享

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

    解析編譯原理

    學(xué)過(guò)編譯原理課程的同學(xué)應(yīng)該有體會(huì),各種文法、各種詞法語(yǔ)法分析算法,非常消磨人的耐心和興致;中間代碼生成和優(yōu)化,其實(shí)在很多應(yīng)用場(chǎng)景下并不重要(當(dāng)然這塊對(duì)于“編譯原理”很重要);語(yǔ)義分析
    發(fā)表于 11-24 09:28 ?3.4w次閱讀
    <b class='flag-5'>解析</b><b class='flag-5'>編譯</b>原理

    詳解SQL解析與應(yīng)用

    為了避免這種損失,般會(huì)在管理上下功夫,比如為研發(fā)人員制定數(shù)據(jù)庫(kù)開(kāi)發(fā)規(guī)范;新上線的SQL,需要DBA進(jìn)行審核;維護(hù)操作需要經(jīng)過(guò)領(lǐng)導(dǎo)審批等等。而且如果希望能夠有效地管理這些措施,需要有效的數(shù)據(jù)庫(kù)培訓(xùn)
    發(fā)表于 06-21 09:28 ?1.2w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>詳解<b class='flag-5'>SQL</b><b class='flag-5'>解析</b>與應(yīng)用

    解析PLC的應(yīng)用

    解析PLC的應(yīng)用,具體的跟隨小編起來(lái)了解下。
    的頭像 發(fā)表于 07-19 11:21 ?5306次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>解析</b>PLC的應(yīng)用

    帶你了解安全測(cè)試基礎(chǔ)之SQL注入

    傳說(shuō),SQL注入是黑客對(duì)數(shù)據(jù)庫(kù)進(jìn)行攻擊的常用手段,今天就來(lái)介紹SQL注入。
    的頭像 發(fā)表于 06-28 11:15 ?2297次閱讀

    嵌入式SQL語(yǔ)句

    編譯程序編譯處理目標(biāo)語(yǔ)言程序主語(yǔ)言訪問(wèn)數(shù)據(jù)庫(kù)基本步驟:第步:打開(kāi)數(shù)據(jù)庫(kù)第二步:定義必要的主變量和數(shù)據(jù)通信去第三步:用SQL訪問(wèn)數(shù)據(jù)庫(kù),并對(duì)返回結(jié)果進(jìn)行處理第四步:關(guān)閉數(shù)據(jù)庫(kù)...
    發(fā)表于 10-21 11:51 ?4次下載
    嵌入式<b class='flag-5'>SQL</b>語(yǔ)句

    掌握MyBatis的動(dòng)態(tài)SQL使用與原理

    摘要:使用動(dòng)態(tài) SQL 并非件易事,但借助可用于任何 SQL 映射語(yǔ)句中的強(qiáng)大的動(dòng)態(tài) SQL 語(yǔ)言,MyBatis 顯著地提升了這特性的
    的頭像 發(fā)表于 01-06 11:27 ?1047次閱讀

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

    昨天在群里看到有小伙伴問(wèn),Java里如何解析SQL語(yǔ)句然后格式化SQL,是否有現(xiàn)成類庫(kù)可以使用?
    的頭像 發(fā)表于 04-10 11:59 ?1033次閱讀

    動(dòng)態(tài)Sql介紹

    動(dòng)態(tài)Sql介紹 動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之。如果你使用過(guò) JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記
    的頭像 發(fā)表于 05-31 09:34 ?1439次閱讀
    動(dòng)態(tài)<b class='flag-5'>Sql</b>介紹

    sql where條件的執(zhí)行順序

    。 在深入討論WHERE條件的執(zhí)行順序之前,先回顧一下一SQL語(yǔ)句的執(zhí)行順序。SQL語(yǔ)句的執(zhí)行通常可以分為以下幾個(gè)步驟:解析器分析語(yǔ)法
    的頭像 發(fā)表于 11-23 11:31 ?2314次閱讀

    oracle執(zhí)行sql查詢語(yǔ)句的步驟是什么

    Oracle數(shù)據(jù)庫(kù)是種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),具有強(qiáng)大的SQL查詢功能。Oracle執(zhí)行SQL查詢語(yǔ)句的步驟包括編寫SQL語(yǔ)句、解析
    的頭像 發(fā)表于 12-06 10:49 ?1050次閱讀