宣布 pl/dotnet 0.99 版(Beta)

由 Brick Abode 於 2024-04-09 發布
相關開放原始碼

宣布 pl/dotnet 0.99 版(Beta)

pl/dotnet 為 PostgreSQL 添加了對 C# 和 F# 的完整支援。 0.99 是我們的公開 Beta 版本;我們希望與世界分享它的驚人之處。

  • 我們支援所有 PL 操作:函數、程序、DO、SPI、觸發器、記錄、SRF、OUT/INOUT、表函數等
  • 我們原生支援 46 個標準使用者類型中的 40 個,是所有外部 PL 中最多的
  • 完全與 NPGSQL 相容,並且 SPI 通過 NPGSQL API 公開以實現最大相容性
  • 在我們的基準測試中,C# 和 F# 是 PostrgreSQL 中最快的程序語言
  • 所有功能都經過 C# 和 F# 的全面測試,包含 1013 個單元測試
  • 在 PostgreSQL 許可證下 100% 免費軟體

這是一個 Beta 版本;我們歡迎使用並接受意見反應。

如何取得

更多詳細資訊如下。

使用範例

pl/dotnet 讓您可以在 PostgreSQL 程序、函數和觸發器中使用 C# 和 F# 的完整功能。

CREATE OR REPLACE FUNCTION dynamic_record_generator_srf(lim INT8)  
RETURNS SETOF record  
AS $$  
    upperLimit = lim.HasValue ? lim : System.Int32.MaxValue;  
    for(long i=0;i<upperLimit;i++){ yield return new object?[] { i, $"Number is {i}" }; }  
$$ LANGUAGE plcsharp;

CREATE OR REPLACE FUNCTION dynamic_record_generator_srf_fsharp(lim INT8)  
RETURNS SETOF record  
AS $$  
    let upperLimit = Option.defaultValue (int64 System.Int32.MaxValue) lim  
    seq { for i in 0L .. upperLimit - 1L do yield [| box i; $"Number is {i}" |] }  
$$ LANGUAGE plfsharp;

SQL 功能

我們支援所有 SQL 函數模式

  • 常規程序和函數
  • 觸發函數,具有完整的觸發器支援:觸發器引數、舊/新列、列重寫(在允許的情況下)以及所有標準觸發器資訊
  • 設定傳回函數,很好地映射到 C# 中的迭代器和 F# 中的序列
  • 表函數,以及傳回記錄或記錄集的函數
  • 完全支援 IN/OUT/INOUT 函數

資料類型支援

我們支援 40 種 PostgreSQL 類型,所有類型都映射到其 NPGSQL 標準 dotnet 類型。 唯一值得注意的例外是 multirange、enum 和 struct 類型,我們希望將來添加它們。 所有資料類型都是可為空的,具有完整的陣列支援,並且已針對 C# 和 F# 進行完整的單元測試。(由於技術原因,格式為 (PostgreSQL 類型:Dotnet 類型) 的列表,而不是表格。)

  • bit: BitArray
  • bool: Bool
  • box: NpgsqlBox
  • bpchar: String
  • bytea: Byte[]
  • cidr: (IPAddress Address, Int Netmask)
  • circle: NpgsqlCircle
  • date: DateOnly
  • daterange: NpgsqlRange<DateOnly>
  • float4: Float
  • float8: Double
  • inet: (IPAddress Address, Int Netmask)
  • int2: Short
  • int4: Int
  • int4range: NpgsqlRange<Int>
  • int8: Long
  • int8range: NpgsqlRange<Long>
  • interval: NpgsqlInterval
  • json: String
  • line: NpgsqlLine
  • lseg: NpgsqlLSeg
  • macaddr8: PhysicalAddress
  • macaddr: PhysicalAddress
  • money: Decimal
  • path: NpgsqlPath
  • point: NpgsqlPoint
  • polygon: NpgsqlPolygon
  • record: Object?[]
  • text: String
  • timestamp: DateTime
  • timestamptz: DateTime
  • time: TimeOnly
  • timetz: DateTimeOffset
  • tsrange: NpgsqlRange<DateTime>
  • tstzrange: NpgsqlRange<DateTime>
  • uuid: Guid
  • varbit: BitArray
  • varchar: String
  • void: Void
  • xml: String

SPI

我們的 SPI 利用 NPGSQL 客戶端函式庫來提供本機 dotnet 實作,該實作與現有客戶端程式碼最大程度地相容。 我們在非常低的層級攔截了 NPGSQL 呼叫,以使用 SPI 呼叫替換客戶端協定處理; 否則,NPGSQL 未經修改。 我們將 NPGSQL 測試套件作為預存程序導入,並將其用於我們的測試,這使我們對我們的相容性等級有了很好的理解。

仍需努力改進相容性並新增功能。 我們持續失敗的最大類別 NPGSQL 測試是錯誤映射,因為 SPI 引發異常的方式與 NPGSQL 不同。 這種不相容性是微小的但數量眾多; 我們將繼續努力改進它們。

以下是我們目前測試的 SPI 操作

  • 資料操作語言 (DML) 操作
    • Select
    • Insert
    • Update
    • Delete
  • 資料定義語言 (DDL) 操作
    • Create Table
    • Alter Table
    • Drop Table
    • Truncate
    • Create Index
    • Drop Index
    • Create View
    • Drop View
    • Create Function
    • Call Function
    • Drop Function
    • Create Procedure
    • Call Procedure
    • Drop Procedure
  • 交易控制
    • Begin Transaction
    • Commit
    • Rollback
  • 支援的資料類型:所有 pl/dotnet 類型
    • 基本類型(包括範圍)
    • 陣列類型
    • 記錄

我們沒有什麼

我們缺乏對 multirange、enum 和複合/表類型的支援。 我們打算添加它們。

我們的 SPI 實作缺少一些次要功能,例如子交易,並且我們有時會以與 NPGSQL 不同的(因此略有不相容的)方式引發錯誤。

我們的建置系統,包含 dpkg 和二進位輸出,功能完善,但不如我們希望的那樣整潔。

我們歡迎提交程式碼以解決任何這些問題,並且我們希望及時改進所有這些問題。

在哪裡取得

我們的作業系統支援

  • 我們完全支援 Linux,並為 Debian 和 Ubuntu 提供 dpkg。(詳細資訊請參閱我們的安裝頁面
  • 我們已經在 OSX(arm 和 x86)上建置和測試了該系統,但我們尚未對其進行封裝。
  • 我們期待很快獲得 Windows 支援; 如果您想提供幫助,請與我們聯繫。

取得聯繫

我們歡迎聽到來自社群的聲音。 您可以透過我們的 GitHub 討論區與我們聯繫,或發送電子郵件至 pldotnet@brickabode.com