[prev in list] [next in list] [prev in thread] [next in thread] 

List:       postgresql-announce
Subject:    Announcing pl/dotnet, version 0.99 (beta)
From:       Brick Abode via PostgreSQL Announce <announce-noreply () postgresql ! org>
Date:       2024-04-09 19:16:01
Message-ID: 171269016169.679.10754905136297628816 () wrigleys ! postgresql ! org
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]


# Announcing pl/dotnet, version 0.99 (beta)

pl/dotnet adds full support for C# and F# to PostgreSQL.  0.99 is our public beta \
release; we wish to share its amazingness with the world.

- We support all PL operations: functions, procedures, DO, SPI, triggers, records, \
                SRF, OUT/INOUT, table functions, etc
- We natively support 40 out of 46 standard user types, the most of any external PL
- Fully NPGSQL-compatible, and SPI is exposed through the NPGSQL API for maximum \
                compatibility
- In our benchmarks, C# and F# are the fastest Procedural Languages in PostrgreSQL
- All features are fully tested for both C# and F#, with 1013 unit tests
- 100% free software under the PostgreSQL license

This is a beta release; we invite usage and welcome feedback.  

Accessing it:

- [Installation instructions: dpkg, \
                docker](https://pldotnet.brickabode.com/how-to-install-pl-net)
- [Our GitHub](https://github.com/Brick-Abode/pldotnet/)
- [Our discussion forum](https://github.com/Brick-Abode/pldotnet/discussions)
- [Our WebPage](https://pldotnet.brickabode.com/)
- [Our FAQ](https://github.com/Brick-Abode/pldotnet/wiki/pldotnet:-Frequently-Asked-Questions)
                
- [Our Wiki](https://github.com/Brick-Abode/pldotnet/wiki/)
- [Our whitepaper](https://github.com/Brick-Abode/pldotnet/wiki/pldotnet:-White-Paper)


More details below.

## Usage example

pl/dotnet gives you the full power of C# and F# in your PostgreSQL
procedures, functions, and triggers.

    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 features

We support all SQL function modes:

- normal procedures and functions
- trigger functions, will full trigger support: trigger arguments, old/new row, row \
                rewriting (where allowed), and all the standard trigger information
- set-returning functions, nicely mapped to iterators in C# and sequences in F#
- table functions, as well as functions returning records or sets of records
- full support for IN/OUT/INOUT functions

## Data type support

We support 40 PostgreSQL types, with all mapped to their NPGSQL-standard dotnet \
types. The only notable exceptions are multirange, enum, and struct types, which we \
hope to add in the future.  All datatypes are nullable, have full array support, and
are fully unit-tested for C# and F#.  (Formatted as a list of (PostgreSQL
type: Dotnet type) instead of a table for technical reasons.)

- `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

Our SPI leverages the NPGSQL client library to provide a native dotnet
implementation which is maximally compatible with existing client code.
We intercepted the NPGSQL calls at a very low level to replace the
client protocol handling with SPI calls; otherwise, NPGSQL was unmodified.
We imported the NPGSQL test suite as stored procedures and are using
it for our testing, giving us very good understanding of our compatiblity
level.

Work remains to improve the compatibility and add features.
Our biggest category of NPGSQL tests that continue to fail is error
mapping, because SPI throws exceptions differently than NPGSQL does.
Such incompatibilities are minor but numerous; we continue working to
improve them.

Here are our currently tested SPI operations:

- Data Manipulation Language (DML) Operations
    - Select
    - Insert
    - Update
    - Delete
- Data Definition Language (DDL) Operations
    - 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
- Transaction Control
    - Begin Transaction
    - Commit
    - Rollback
- Supported Data Types: all pl/dotnet types
    - Basic types (including ranges)
    - Array types
    - Record

## What we don't have

We lack support for multirange, enum, and composite/table types.  We intend to add \
them.

Our SPI implementation lacks some minor features like sub-transactions, and we \
sometimes raise errors in a different (and therefore slightly incompatible) way from \
NPGSQL.

Our build system, with both dpkg and binary output, is functional but not as tidy as \
we would like.

We welcome code submissions to address any of these issues, and we hope to improve \
them all in time.

## Where to get it

Our operating system support:

- We fully support Linux and provide dpkg's for Debian and Ubuntu.  (Details on our \
                [installation \
                page](https://pldotnet.brickabode.com/how-to-install-pl-net))
- We have built and tested the system on OSX (arm and x86), but we have not packaged \
                it yet.
- We look forward to having Windows support soon; ping us if you would like to help.

# Getting in touch

We welcome hearing from the community.  You can reach us at our [GitHub discussion \
forum](https://github.com/Brick-Abode/pldotnet/discussions) or email us at \
[pldotnet@brickabode.com](mailto:pldotnet@brickabode.com).


[Attachment #5 (text/html)]

<!doctype html>
<html>
  <head>
    <meta name="viewport" content="width=device-width">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Announcing pl/dotnet, version 0.99 (beta)</title>
    <style>

    @media only screen and (max-width: 620px) {
      table[class=body] h1 {
        font-size: 28px !important;
        margin-bottom: 10px !important;
      }
      table[class=body] p,
            table[class=body] ul,
            table[class=body] ol,
            table[class=body] td,
            table[class=body] span,
            table[class=body] a {
        font-size: 16px !important;
      }
      table[class=body] .wrapper,
            table[class=body] .article {
        padding: 10px !important;
      }
      table[class=body] .content {
        padding: 0 !important;
      }
      table[class=body] .container {
        padding: 0 !important;
        width: 100% !important;
      }
      table[class=body] .main {
        border-left-width: 0 !important;
        border-radius: 0 !important;
        border-right-width: 0 !important;
      }
      table[class=body] .btn table {
        width: 100% !important;
      }
      table[class=body] .btn a {
        width: 100% !important;
      }
      table[class=body] .img-responsive {
        height: auto !important;
        max-width: 100% !important;
        width: auto !important;
      }
    }

    @media all {
      .ExternalClass {
        width: 100%;
      }
      .ExternalClass,
            .ExternalClass p,
            .ExternalClass span,
            .ExternalClass font,
            .ExternalClass td,
            .ExternalClass div {
        line-height: 100%;
      }
      .apple-link a {
        color: inherit !important;
        font-family: inherit !important;
        font-size: inherit !important;
        font-weight: inherit !important;
        line-height: inherit !important;
        text-decoration: none !important;
      }
      #MessageViewBody a {
        color: inherit;
        text-decoration: none;
        font-size: inherit;
        font-family: inherit;
        font-weight: inherit;
        line-height: inherit;
      }
      .btn-primary table td:hover {
        background-color: #34495e !important;
      }
      .btn-primary a:hover {
        background-color: #34495e !important;
        border-color: #34495e !important;
      }
    }
    </style>
  </head>
  <body class="" style="background-color: #f6f6f6; font-family: sans-serif; \
-webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.4; margin: 0; \
padding: 0; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;">  <table \
border="0" cellpadding="0" cellspacing="0" class="body" style="border-collapse: \
separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; \
background-color: #f6f6f6;">  <tr>
        <td style="font-family: sans-serif; font-size: 14px; vertical-align: \
top;">&nbsp;</td>  <td class="container" style="font-family: sans-serif; font-size: \
14px; vertical-align: top; display: block; Margin: 0 auto; max-width: 580px; padding: \
                10px; width: 580px;">
          <div class="content" style="box-sizing: border-box; display: block; Margin: \
0 auto; max-width: 580px; padding: 10px;">


            <span class="preheader" style="color: transparent; display: none; height: \
0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; \
visibility: hidden; width: 0;"></span>  <table class="main" style="border-collapse: \
separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background: \
#ffffff; border-radius: 3px;">


              <tr>
                <td class="wrapper" style="font-family: sans-serif; font-size: 14px; \
                vertical-align: top; box-sizing: border-box; padding: 20px;">
                  <table border="0" cellpadding="0" cellspacing="0" \
style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; \
width: 100%;">  <tr>
                      <td style="font-family: sans-serif; font-size: 14px; \
vertical-align: top;">

<div>
<h1 style="color: #000; font-family: sans-serif; line-height: 1.4; margin: 0; \
margin-bottom: 30px; font-size: 25px; font-weight: 300; text-align: \
center">Announcing pl/dotnet, version 0.99 (beta)</h1> </div>
<h1 style="color: #000; font-family: sans-serif; line-height: 1.4; margin: 0; \
margin-bottom: 30px; font-size: 25px; font-weight: 300; text-align: \
center">Announcing pl/dotnet, version 0.99 (beta)</h1> <p style="font-family: \
sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: \
15px">pl/dotnet adds full support for C# and F# to PostgreSQL.  0.99 is our public \
beta release; we wish to share its amazingness with the world.</p> <ul \
style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px"> <li style="list-style-position: inside; margin-left: 5px">We \
support all PL operations: functions, procedures, DO, SPI, triggers, records, SRF, \
OUT/INOUT, table functions, etc</li> <li style="list-style-position: inside; \
margin-left: 5px">We natively support 40 out of 46 standard user types, the most of \
any external PL</li> <li style="list-style-position: inside; margin-left: 5px">Fully \
NPGSQL-compatible, and SPI is exposed through the NPGSQL API for maximum \
compatibility</li> <li style="list-style-position: inside; margin-left: 5px">In our \
benchmarks, C# and F# are the fastest Procedural Languages in PostrgreSQL</li> <li \
style="list-style-position: inside; margin-left: 5px">All features are fully tested \
for both C# and F#, with 1013 unit tests</li> <li style="list-style-position: inside; \
margin-left: 5px">100% free software under the PostgreSQL license</li> </ul>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px">This is a beta release; we invite usage and welcome feedback.  \
</p> <p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: \
0; margin-bottom: 15px">Accessing it:</p> <ul style="font-family: sans-serif; \
font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px"> <li \
style="list-style-position: inside; margin-left: 5px"><a \
href="https://pldotnet.brickabode.com/how-to-install-pl-net" style="color: #3498db; \
text-decoration: underline">Installation instructions: dpkg, docker</a></li> <li \
style="list-style-position: inside; margin-left: 5px"><a \
href="https://github.com/Brick-Abode/pldotnet/" style="color: #3498db; \
text-decoration: underline">Our GitHub</a></li> <li style="list-style-position: \
inside; margin-left: 5px"><a \
href="https://github.com/Brick-Abode/pldotnet/discussions" style="color: #3498db; \
text-decoration: underline">Our discussion forum</a></li> <li \
style="list-style-position: inside; margin-left: 5px"><a \
href="https://pldotnet.brickabode.com/" style="color: #3498db; text-decoration: \
underline">Our WebPage</a></li> <li style="list-style-position: inside; margin-left: \
5px"><a href="https://github.com/Brick-Abode/pldotnet/wiki/pldotnet:-Frequently-Asked-Questions" \
style="color: #3498db; text-decoration: underline">Our FAQ</a></li> <li \
style="list-style-position: inside; margin-left: 5px"><a \
href="https://github.com/Brick-Abode/pldotnet/wiki/" style="color: #3498db; \
text-decoration: underline">Our Wiki</a></li> <li style="list-style-position: inside; \
margin-left: 5px"><a \
href="https://github.com/Brick-Abode/pldotnet/wiki/pldotnet:-White-Paper" \
style="color: #3498db; text-decoration: underline">Our whitepaper</a></li> </ul>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px">More details below.</p> <h2 style="color: #000; font-family: \
sans-serif; font-weight: 400; line-height: 1.4; margin: 0; margin-bottom: 30px">Usage \
example</h2> <p style="font-family: sans-serif; font-size: 14px; font-weight: normal; \
margin: 0; margin-bottom: 15px">pl/dotnet gives you the full power of C# and F# in \
your PostgreSQL procedures, functions, and triggers.</p>
<pre><code>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&lt;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;
</code></pre>
<h2 style="color: #000; font-family: sans-serif; font-weight: 400; line-height: 1.4; \
margin: 0; margin-bottom: 30px">SQL features</h2> <p style="font-family: sans-serif; \
font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px">We support all \
SQL function modes:</p> <ul style="font-family: sans-serif; font-size: 14px; \
font-weight: normal; margin: 0; margin-bottom: 15px"> <li style="list-style-position: \
inside; margin-left: 5px">normal procedures and functions</li> <li \
style="list-style-position: inside; margin-left: 5px">trigger functions, will full \
trigger support: trigger arguments, old/new row, row rewriting (where allowed), and \
all the standard trigger information</li> <li style="list-style-position: inside; \
margin-left: 5px">set-returning functions, nicely mapped to iterators in C# and \
sequences in F#</li> <li style="list-style-position: inside; margin-left: 5px">table \
functions, as well as functions returning records or sets of records</li> <li \
style="list-style-position: inside; margin-left: 5px">full support for IN/OUT/INOUT \
functions</li> </ul>
<h2 style="color: #000; font-family: sans-serif; font-weight: 400; line-height: 1.4; \
margin: 0; margin-bottom: 30px">Data type support</h2> <p style="font-family: \
sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px">We \
support 40 PostgreSQL types, with all mapped to their NPGSQL-standard dotnet types. \
The only notable exceptions are multirange, enum, and struct types, which we hope to \
add in the future.  All datatypes are nullable, have full array support, and are \
                fully unit-tested for C# and F#.  (Formatted as a list of (PostgreSQL
type: Dotnet type) instead of a table for technical reasons.)</p>
<ul style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px"> <li style="list-style-position: inside; margin-left: \
5px"><code>bit</code>: <code>BitArray</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>bool</code>: <code>Bool</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>box</code>: \
<code>NpgsqlBox</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>bpchar</code>: <code>String</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>bytea</code>: <code>Byte[]</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>cidr</code>: \
<code>(IPAddress Address, Int Netmask)</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>circle</code>: <code>NpgsqlCircle</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>date</code>: \
<code>DateOnly</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>daterange</code>: <code>NpgsqlRange&lt;DateOnly&gt;</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>float4</code>: \
<code>Float</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>float8</code>: <code>Double</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>inet</code>: <code>(IPAddress Address, Int \
Netmask)</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>int2</code>: <code>Short</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>int4</code>: <code>Int</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>int4range</code>: \
<code>NpgsqlRange&lt;Int&gt;</code></li> <li style="list-style-position: inside; \
margin-left: 5px"><code>int8</code>: <code>Long</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>int8range</code>: \
<code>NpgsqlRange&lt;Long&gt;</code></li> <li style="list-style-position: inside; \
margin-left: 5px"><code>interval</code>: <code>NpgsqlInterval</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>json</code>: \
<code>String</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>line</code>: <code>NpgsqlLine</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>lseg</code>: <code>NpgsqlLSeg</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>macaddr8</code>: \
<code>PhysicalAddress</code></li> <li style="list-style-position: inside; \
margin-left: 5px"><code>macaddr</code>: <code>PhysicalAddress</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>money</code>: \
<code>Decimal</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>path</code>: <code>NpgsqlPath</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>point</code>: <code>NpgsqlPoint</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>polygon</code>: \
<code>NpgsqlPolygon</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>record</code>: <code>Object?[]</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>text</code>: <code>String</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>timestamp</code>: \
<code>DateTime</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>timestamptz</code>: <code>DateTime</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>time</code>: \
<code>TimeOnly</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>timetz</code>: <code>DateTimeOffset</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>tsrange</code>: \
<code>NpgsqlRange&lt;DateTime&gt;</code></li> <li style="list-style-position: inside; \
margin-left: 5px"><code>tstzrange</code>: \
<code>NpgsqlRange&lt;DateTime&gt;</code></li> <li style="list-style-position: inside; \
margin-left: 5px"><code>uuid</code>: <code>Guid</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>varbit</code>: \
<code>BitArray</code></li> <li style="list-style-position: inside; margin-left: \
5px"><code>varchar</code>: <code>String</code></li> <li style="list-style-position: \
inside; margin-left: 5px"><code>void</code>: <code>Void</code></li> <li \
style="list-style-position: inside; margin-left: 5px"><code>xml</code>: \
<code>String</code></li> </ul>
<h2 style="color: #000; font-family: sans-serif; font-weight: 400; line-height: 1.4; \
margin: 0; margin-bottom: 30px">SPI</h2> <p style="font-family: sans-serif; \
font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px">Our SPI \
leverages the NPGSQL client library to provide a native dotnet implementation which \
is maximally compatible with existing client code. We intercepted the NPGSQL calls at \
a very low level to replace the client protocol handling with SPI calls; otherwise, \
NPGSQL was unmodified. We imported the NPGSQL test suite as stored procedures and are \
using it for our testing, giving us very good understanding of our compatiblity
level.</p>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px">Work remains to improve the compatibility and add features. Our \
biggest category of NPGSQL tests that continue to fail is error mapping, because SPI \
throws exceptions differently than NPGSQL does. Such incompatibilities are minor but \
numerous; we continue working to improve them.</p>
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px">Here are our currently tested SPI operations:</p> <ul \
style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px"> <li style="list-style-position: inside; margin-left: 5px">Data \
Manipulation Language (DML) Operations<ul style="font-family: sans-serif; font-size: \
14px; font-weight: normal; margin: 0; margin-bottom: 15px"> <li \
style="list-style-position: inside; margin-left: 5px">Select</li> <li \
style="list-style-position: inside; margin-left: 5px">Insert</li> <li \
style="list-style-position: inside; margin-left: 5px">Update</li> <li \
style="list-style-position: inside; margin-left: 5px">Delete</li> </ul>
</li>
<li style="list-style-position: inside; margin-left: 5px">Data Definition Language \
(DDL) Operations<ul style="font-family: sans-serif; font-size: 14px; font-weight: \
normal; margin: 0; margin-bottom: 15px"> <li style="list-style-position: inside; \
margin-left: 5px">Create Table</li> <li style="list-style-position: inside; \
margin-left: 5px">Alter Table</li> <li style="list-style-position: inside; \
margin-left: 5px">Drop Table</li> <li style="list-style-position: inside; \
margin-left: 5px">Truncate</li> <li style="list-style-position: inside; margin-left: \
5px">Create Index</li> <li style="list-style-position: inside; margin-left: 5px">Drop \
Index</li> <li style="list-style-position: inside; margin-left: 5px">Create View</li>
<li style="list-style-position: inside; margin-left: 5px">Drop View</li>
<li style="list-style-position: inside; margin-left: 5px">Create Function</li>
<li style="list-style-position: inside; margin-left: 5px">Call Function</li>
<li style="list-style-position: inside; margin-left: 5px">Drop Function</li>
<li style="list-style-position: inside; margin-left: 5px">Create Procedure</li>
<li style="list-style-position: inside; margin-left: 5px">Call Procedure</li>
<li style="list-style-position: inside; margin-left: 5px">Drop Procedure</li>
</ul>
</li>
<li style="list-style-position: inside; margin-left: 5px">Transaction Control<ul \
style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; \
margin-bottom: 15px"> <li style="list-style-position: inside; margin-left: 5px">Begin \
Transaction</li> <li style="list-style-position: inside; margin-left: \
5px">Commit</li> <li style="list-style-position: inside; margin-left: \
5px">Rollback</li> </ul>
</li>
<li style="list-style-position: inside; margin-left: 5px">Supported Data Types: all \
pl/dotnet types<ul style="font-family: sans-serif; font-size: 14px; font-weight: \
normal; margin: 0; margin-bottom: 15px"> <li style="list-style-position: inside; \
margin-left: 5px">Basic types (including ranges)</li> <li style="list-style-position: \
inside; margin-left: 5px">Array types</li> <li style="list-style-position: inside; \
margin-left: 5px">Record</li> </ul>
</li>
</ul>
<h2 style="color: #000; font-family: sans-serif; font-weight: 400; line-height: 1.4; \
margin: 0; margin-bottom: 30px">What we don't have</h2> <p style="font-family: \
sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px">We \
lack support for multirange, enum, and composite/table types.  We intend to add \
them.</p> <p style="font-family: sans-serif; font-size: 14px; font-weight: normal; \
margin: 0; margin-bottom: 15px">Our SPI implementation lacks some minor features like \
sub-transactions, and we sometimes raise errors in a different (and therefore \
slightly incompatible) way from NPGSQL.</p> <p style="font-family: sans-serif; \
font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px">Our build \
system, with both dpkg and binary output, is functional but not as tidy as we would \
like.</p> <p style="font-family: sans-serif; font-size: 14px; font-weight: normal; \
margin: 0; margin-bottom: 15px">We welcome code submissions to address any of these \
issues, and we hope to improve them all in time.</p> <h2 style="color: #000; \
font-family: sans-serif; font-weight: 400; line-height: 1.4; margin: 0; \
margin-bottom: 30px">Where to get it</h2> <p style="font-family: sans-serif; \
font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px">Our operating \
system support:</p> <ul style="font-family: sans-serif; font-size: 14px; font-weight: \
normal; margin: 0; margin-bottom: 15px"> <li style="list-style-position: inside; \
margin-left: 5px">We fully support Linux and provide dpkg's for Debian and Ubuntu.  \
(Details on our <a href="https://pldotnet.brickabode.com/how-to-install-pl-net" \
style="color: #3498db; text-decoration: underline">installation page</a>)</li> <li \
style="list-style-position: inside; margin-left: 5px">We have built and tested the \
system on OSX (arm and x86), but we have not packaged it yet.</li> <li \
style="list-style-position: inside; margin-left: 5px">We look forward to having \
Windows support soon; ping us if you would like to help.</li> </ul>
<h1 style="color: #000; font-family: sans-serif; line-height: 1.4; margin: 0; \
margin-bottom: 30px; font-size: 25px; font-weight: 300; text-align: center">Getting \
in touch</h1> <p style="font-family: sans-serif; font-size: 14px; font-weight: \
normal; margin: 0; margin-bottom: 15px">We welcome hearing from the community.  You \
can reach us at our <a href="https://github.com/Brick-Abode/pldotnet/discussions" \
style="color: #3498db; text-decoration: underline">GitHub discussion forum</a> or \
email us at <a href="mailto:pldotnet@brickabode.com" style="color: #3498db; \
text-decoration: underline">pldotnet@brickabode.com</a>.</p>

                      </td>
                    </tr>
                  </table>
                </td>
              </tr>

            </table>

            <div class="footer" style="clear: both; Margin-top: 10px; text-align: \
                center; width: 100%;">
              <table border="0" cellpadding="0" cellspacing="0" \
style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; \
width: 100%;">  <tr>
                  <td class="content-block" style="font-family: sans-serif; \
vertical-align: top; padding-bottom: 10px; padding-top: 10px; font-size: 12px; color: \
                #999999; text-align: center;">
                    <span class="apple-link" style="color: #999999; font-size: 12px; \
text-align: center;"> This email was sent to you from Brick Abode. It was delivered \
on their behalf by the PostgreSQL project. Any questions about the content of the \
message should be sent to Brick Abode.
</span>
		    <br><br>
You were sent this email as a subscriber of the <em>pgsql-announce</em> mailinglist, \
for the content tag Related Open Source.
To unsubscribe from
further emails, or change which emails you want to receive, please click the personal \
unsubscribe link that you can find in the headers of this email, or visit
<a href="https://lists.postgresql.org/unsubscribe/" style="color: #3498db; \
text-decoration: underline">https://lists.postgresql.org/unsubscribe/</a>.

                  </td>
                </tr>
              </table>
            </div>

          </div>
        </td>
        <td style="font-family: sans-serif; font-size: 14px; vertical-align: \
top;">&nbsp;</td>  </tr>
    </table>
  </body>
</html>



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic