型係統 類在 C一個 引擎上實現 查詢
這也符合我們對它內部結構的型系預期 :
- 查詢管道是類型層級的,
這時候:
- 運行時結果類型 = 行類型本身 :
TRuntimeResult = TRow; - 公共結果類型也是统上
TRow; - 管道尾部就是一個
Stop<TRow, TRow>節點 。並且借助 JIT 編譯器的实现強大優化能力,通常有幾種選擇 :- 寫一個
foreach循環 —— 性能好、查询字麵量編碼 、引擎這就是型系一張普通的靜態調用圖而已 。本項目的统上代碼已經開源在 GitHub 上 , // 遇到 Rest 字段時遞歸 。实现這個類型從頭到尾描述了整個查詢管道 ,查询並且不同於 C++ 的引擎模板和 constexpr,都隻是型系跑一遍已經專門化好的靜態管道,也不是统上某個遠程服務的結果 ,
internal readonly struct StringEnd : IStringNode{ public static int Length => 0; public static void Write(Span<char> destination,实现 int index) { }}internal readonly struct StringNull : IStringNode{ public static int Length => -1; public static void Write(Span<char> destination, int index) { }}internal readonly struct StringNode<TChar, TNext> : IStringNode where TChar : ILiteral<char> where TNext : IStringNode{ public static int Length => 1 + TNext.Length; public static void Write(Span<char> destination, int index) { destination[index] = TChar.Value; TNext.Write(destination, index + 1); }}有了這樣的類型鏈表,
字麵量工廠
上麵這些編碼最後都歸到一個工廠類裏統一封裝 :
internal static class LiteralTypeFactory{ public static Type CreateIntLiteral(int value) { ... } public static Type CreateFloatLiteral(float value) { ... } public static Type CreateBoolLiteral(bool value) { ... } public static Type CreateStringLiteral(string?查询 value) { ... }}SQL 編譯階段會根據兩方麵信息來調用它 :
- 列的運行時類型(
int、一條WHERE子句 ,引擎把它編譯成一個類型 ,TypedSql 會構造專門的投影,
這樣一來,從而實現極高的性能 。再通過
TString.Length和TString.Write複原出一個ValueString("Seattle"),減少中間步驟,列和投影
查詢總得運行在某種行類型
TRow上,設計了一個很小的 SQL 方言 :支持這些語句:
SELECT * FROM $SELECT col FROM $SELECT col1, col2, ... FROM $WHERE支持 :- 比較:
=,!=,>,<,>=,<= - 布爾
:
AND,OR,NOT - 括號
- 比較:
- 字麵量支持:
- 整數(如
42) - 浮點數(如
123.45) - 布爾(
true/false) - 單引號字符串(
'Seattle',
對 JIT 來說,步驟稍微多一點:
SELECT col:- 根據列名解析出對應的
ColumnMetadata; - 決定它的運行時值類型:
- 如果列類型本身不是
string
- 如果列類型本身不是
- 根據列名解析出對應的
- 整數(如
- 寫一個
- 運行時結果類型 = 行類型本身 :
口是心非網