日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

OushuDB 用戶指南之類(lèi)型轉(zhuǎn)換

 北漂二號(hào) 2021-12-22

概述

SQL是強(qiáng)類(lèi)型語(yǔ)言。也就是說(shuō),每個(gè)數(shù)據(jù)都與一個(gè)決定其行為和用法的數(shù)據(jù)類(lèi)型相關(guān)聯(lián)。OushuDB 有一個(gè)可擴(kuò)展的數(shù)據(jù)類(lèi)型系統(tǒng), 該系統(tǒng)比其它SQL實(shí)現(xiàn)更具通用性和靈活性。因此,OushuDB 中大多數(shù)類(lèi)型轉(zhuǎn)換是由通用規(guī)則來(lái)管理的, 而不是由專(zhuān)門(mén)的試探法分析的,這種做法允許使用混合類(lèi)型的表達(dá)式, 即便是其中包含用戶定義的類(lèi)型也如此。

OushuDB 掃描/分析器只將詞法元素分解成五個(gè)基本種類(lèi): 整數(shù)、浮點(diǎn)數(shù)、字符串、標(biāo)識(shí)符、關(guān)鍵字。大多數(shù)非數(shù)字類(lèi)型首先表征為字符串,SQL 語(yǔ)言定義允許聲明字符串的類(lèi)型名,而且這種機(jī)制可以用于OushuDB 保證分析器沿著正確的方向運(yùn)行。例如,查詢:

SELECT text 'Origin' AS "label", point '(0,0)' AS "value";label | value--------+-------Origin | (0,0)(1 row)

有兩個(gè)文本常量,類(lèi)型分別為text和point。 如果沒(méi)有為字符串文本聲明類(lèi)型,該文本先被初始化成一個(gè)擁有存儲(chǔ)空間的 unknown類(lèi)型,該類(lèi)型將在后面描述的晚期階段分析。

在OushuDB 分析器里, 有四種基本的SQL元素需要獨(dú)立的類(lèi)型轉(zhuǎn)換規(guī)則:

函數(shù)調(diào)用

多數(shù)OushuDB 類(lèi)型系統(tǒng)是建立在一套豐富的函數(shù)上的。函數(shù)調(diào)用可以有一個(gè)或多個(gè)參數(shù)。因?yàn)镺ushuDB 允許函數(shù)重載, 所以函數(shù)名自身并不唯一地標(biāo)識(shí)將要調(diào)用的函數(shù), 分析器必須根據(jù)函數(shù)提供的參數(shù)類(lèi)型選擇正確的函數(shù)。

操作符

OushuDB 允許在表達(dá)式上使用前綴或后綴(單目)操作符, 也允許表達(dá)式內(nèi)部使用雙目操作符(兩個(gè)參數(shù))。像函數(shù)一樣,操作符也可以被重載, 因此操作符的選擇也和函數(shù)一樣取決于參數(shù)類(lèi)型。

值存儲(chǔ)

INSERT和UPDATE語(yǔ)句將表達(dá)式結(jié)果放入表中。 語(yǔ)句中的表達(dá)式類(lèi)型必須和目標(biāo)列的類(lèi)型一致或者可以轉(zhuǎn)換為一致。

UNION, CASE和相關(guān)構(gòu)造

因?yàn)槁?lián)合SELECT語(yǔ)句中的所有查詢結(jié)果必須在一列里顯示出來(lái), 所以每個(gè)SELECT子句中的元素類(lèi)型必須相互匹配并轉(zhuǎn)換成一套統(tǒng)一類(lèi)型。 類(lèi)似地,一個(gè)CASE構(gòu)造的結(jié)果表達(dá)式必須轉(zhuǎn)換成統(tǒng)一的類(lèi)型, 這樣CASE表達(dá)式自身作為整體有一種已知輸出類(lèi)型。 同樣的要求也存在于ARRAY構(gòu)造中。

系統(tǒng)表casts存儲(chǔ)有關(guān)哪種數(shù)據(jù)類(lèi)型之間存在哪種轉(zhuǎn)換以及如何執(zhí)行這些轉(zhuǎn)換的信息。額外的轉(zhuǎn)換可以由用戶通過(guò)CREATE CAST命令增加。(這個(gè)通常和定義一種新的數(shù)據(jù)類(lèi)型一起完成。內(nèi)置的類(lèi)型轉(zhuǎn)換集已經(jīng)經(jīng)過(guò)仔細(xì)的雕琢了, 因此最好不要去更改它們。)

分析器中還提供了一個(gè)額外的搜索器,允許提高對(duì)有隱含轉(zhuǎn)換的類(lèi)型組之間的適當(dāng)?shù)霓D(zhuǎn)換行為的決斷。數(shù)據(jù)類(lèi)型分成了幾個(gè)基本 類(lèi)型分類(lèi) ,包括:boolean, numeric, string, bitstring, datetime, timespan, geometric, network, user-defined(用戶定義)。每種類(lèi)型(除用戶定義)都有一種或多種 首選類(lèi)型 用于解決類(lèi)型選擇的問(wèn)題。因此歧義的表達(dá)式(那些有多個(gè)候選解析方案的)當(dāng)有多個(gè)內(nèi)置類(lèi)型時(shí)可以解決,但是用戶定義的類(lèi)型有多個(gè)選擇時(shí)會(huì)產(chǎn)生錯(cuò)誤。

所有類(lèi)型轉(zhuǎn)換規(guī)則都是建立在下面幾個(gè)基本原則上的:

  • 隱含轉(zhuǎn)換決不能有奇怪的或不可預(yù)見(jiàn)的輸出。

  • 解析器沒(méi)有 先驗(yàn) 知識(shí)的用戶定義類(lèi)型應(yīng)該是 “較高的” 類(lèi)型等級(jí)。在混合類(lèi)型表達(dá)式中,本地類(lèi)型總應(yīng)該轉(zhuǎn)換為用戶定義的類(lèi)型(當(dāng)然,只要轉(zhuǎn)換是必要的)。

  • 用戶定義的類(lèi)型是不相關(guān)的。現(xiàn)在,除了內(nèi)置類(lèi)型的硬編碼啟發(fā)式和可用函數(shù)和轉(zhuǎn)換的隱式關(guān)系外,OushuDB 沒(méi)有類(lèi)型之間關(guān)系的可用信息。

  • 如果一個(gè)查詢不需要隱含的類(lèi)型轉(zhuǎn)換,分析器或執(zhí)行器不應(yīng)該進(jìn)行更多的額外操作。 這就是說(shuō),任何一個(gè)類(lèi)型匹配、格式清晰的查詢不應(yīng)該在分析器里耗費(fèi)更多的時(shí)間, 也不應(yīng)該向查詢中引入任何不必要的隱含類(lèi)型轉(zhuǎn)換調(diào)用。

另外,如果一個(gè)查詢通常使用某個(gè)函數(shù)進(jìn)行隱含類(lèi)型轉(zhuǎn)換,而用戶定義了一個(gè)有正確參數(shù)的函數(shù), 解釋器應(yīng)該使用新函數(shù)取代原先舊函數(shù)的隱含操作。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多