Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
fd47bca
Bump GitHub Actions to latest major versions
Giorgi May 24, 2026
8666a03
Update to 1.5.4
Giorgi Jun 23, 2026
38ddceb
Merge branch 'main' into develop
Giorgi Jun 23, 2026
5efc5e5
Add Apache Arrow result streaming to DuckDBCommand (#334)
luisquintanilla Jun 24, 2026
87da4c7
Include DuckDB error type when throwing DuckDBException
Giorgi Jun 24, 2026
6f5a68d
Use duckdb_appender_error_data for appender error handling
Giorgi Jun 24, 2026
1ae01e9
Skip Convert.ChangeType on the same-type object read path
skuirrels Jul 10, 2026
fe2abc5
Avoid LINQ and boxed-enumerator allocations in parameter binding
skuirrels Jul 10, 2026
9a8aa5a
Add safe reusable appender row API
skuirrels Jul 13, 2026
d8e201e
Finalize completed rows after appender failures
skuirrels Jul 20, 2026
f027d60
Reuse prepared statements in DuckDBCommand
skuirrels Jul 15, 2026
5af174e
Avoid iterator allocation for prepared ExecuteNonQuery
skuirrels Jul 21, 2026
7b61480
Cache typed map materializers to avoid boxing and per-row reflection
skuirrels Jul 20, 2026
daa3084
Pre-size list results during materialization
skuirrels Jul 21, 2026
2eb5787
Bind scalar parameters through native functions
skuirrels Jul 21, 2026
0238824
Resolve consolidated branch integration conflicts
skuirrels Jul 21, 2026
2fef8c7
Add cross-driver benchmark comparison (Go, Java, EF Core, DuckDB.NET …
skuirrels Jul 20, 2026
794398d
Add scoped appender row writer
skuirrels Jul 21, 2026
2b04e5e
Add scoped appender row writer
skuirrels Jul 21, 2026
a73a0eb
Update driver benchmark lanes and scoped writer coverage
skuirrels Jul 21, 2026
bfb58ab
Refresh consolidated driver benchmark comparison
skuirrels Jul 21, 2026
1cf3d58
Prepare fork preview packages
skuirrels Jul 21, 2026
2e16e69
Merge pull request #2 from skuirrels/release/fork-1.5.4
skuirrels Jul 21, 2026
9b483f7
Point fork README to preview packages
skuirrels Jul 21, 2026
62af28a
Merge pull request #3 from skuirrels/release/fork-1.5.4
skuirrels Jul 21, 2026
108f024
Use compact preview package badges
skuirrels Jul 21, 2026
43ae4d5
Merge pull request #4 from skuirrels/release/fork-1.5.4
skuirrels Jul 21, 2026
e60df12
Remove project icon from README
skuirrels Jul 21, 2026
3893836
Revise README to highlight cutting-edge performance
skuirrels Jul 21, 2026
148dc2c
Update README title for performance fork preview
skuirrels Jul 21, 2026
c9e2ae5
Optimize prepared scalar execution (#5)
skuirrels Jul 21, 2026
3e58971
Update README.md
skuirrels Jul 21, 2026
19135e0
Prepare stable fork package release (#6)
skuirrels Jul 23, 2026
a1b2a35
Enable stable fork release workflow (#7)
skuirrels Jul 23, 2026
7a93b23
Optimize mapped appends and typed parameter binding
skuirrels Jul 23, 2026
f577aac
Merge fork release infrastructure
skuirrels Jul 23, 2026
5161dc0
Merge stable fork release baseline
skuirrels Jul 23, 2026
ddeecc0
Prepare 1.5.5 preview release
skuirrels Jul 23, 2026
e2cc3ae
Prepare 1.5.5 stable release
skuirrels Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/NuGet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
steps:

- name: Download Artifacts
uses: dawidd6/action-download-artifact@v6
uses: dawidd6/action-download-artifact@v21
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
workflow: ci.yml
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/Sonar.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,30 +28,30 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Set up JDK 11
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
java-version: 17
distribution: 'zulu' # Alternative distribution options are available.
- uses: actions/checkout@v4
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha || github.ref }}
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis

- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

- name: Cache SonarCloud packages
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ~/sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar

- name: Cache SonarCloud scanner
id: cache-sonar-scanner
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: ./.sonar/scanner
key: ${{ runner.os }}-sonar-scanner
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,13 @@ jobs:
echo "NightlyBuild=true" >> $env:GITHUB_ENV

- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ env.BuildBranch }}

- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

Expand Down Expand Up @@ -82,14 +82,14 @@ jobs:

- name: Upload coverage reports to Codecov
if: matrix.os == 'ubuntu-latest' && github.event_name != 'schedule'
uses: codecov/codecov-action@v4.0.1
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: Giorgi/DuckDB.NET

- name: Upload Artifacts
if: matrix.os == 'ubuntu-latest' && github.event_name != 'pull_request' && github.actor == 'Giorgi'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: nugetPackages-${{github.ref_name}}
path: ./**/bin/Release/*.nupkg
Expand All @@ -103,7 +103,7 @@ jobs:
if: github.ref == 'refs/heads/develop' && github.event_name != 'pull_request' && github.event_name != 'schedule'
steps:
- name: Download nuget package artifact
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
name: nugetPackages-${{github.ref_name}}

Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
Expand All @@ -59,7 +59,7 @@ jobs:
# queries: security-extended,security-and-quality

- name: Setup .NET Core SDK
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

Expand All @@ -82,4 +82,4 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4
152 changes: 152 additions & 0 deletions .github/workflows/preview-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
name: Fork Package Release

on:
release:
types: [published]

permissions:
contents: write
id-token: write

jobs:
publish-fork-package:
if: >-
startsWith(github.event.release.tag_name, 'v1.5.') &&
((github.event.release.prerelease == true &&
contains(github.event.release.tag_name, '-preview.')) ||
(github.event.release.prerelease == false &&
!contains(github.event.release.tag_name, '-')))
runs-on: ubuntu-latest
environment: nuget-preview

steps:
- name: Checkout release tag
uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event.release.tag_name }}

- name: Set package version and release mode
shell: bash
run: |
version="${{ github.event.release.tag_name }}"
version="${version#v}"

if [[ "$version" =~ ^1\.5\.[0-9]+-preview\.[0-9]+$ ]]; then
fork_preview=true
fork_release=false
elif [[ "$version" =~ ^1\.5\.[0-9]+$ ]]; then
fork_preview=false
fork_release=true
else
echo "Unexpected fork package version: $version" >&2
exit 1
fi

{
echo "PACKAGE_VERSION=$version"
echo "FORK_PREVIEW=$fork_preview"
echo "FORK_RELEASE=$fork_release"
} >> "$GITHUB_ENV"

- name: Setup .NET SDK
uses: actions/setup-dotnet@v5
with:
global-json-file: global.json

- name: Restore
run: dotnet restore DuckDB.NET.slnx /p:CI=false

- name: Build
run: >-
dotnet build DuckDB.NET.slnx
--configuration Release
--no-restore
/m:1
/p:BuildType=Full
/p:CI=false
/p:ForkPreview="$FORK_PREVIEW"
/p:ForkRelease="$FORK_RELEASE"
/p:Version="$PACKAGE_VERSION"
/p:PackageVersion="$PACKAGE_VERSION"
/p:UseSharedCompilation=false

- name: Test
run: >-
dotnet test DuckDB.NET.Test/Test.csproj
--configuration Release
--no-build
--no-restore
--logger "console;verbosity=quiet"
/p:BuildType=Full
/p:CI=false
/p:ForkPreview="$FORK_PREVIEW"
/p:ForkRelease="$FORK_RELEASE"
/p:DoesNotReturnAttribute=DoesNotReturnAttribute

- name: Pack fork packages
shell: bash
run: |
mkdir -p artifacts/fork-release
common_args=(
--configuration Release
--no-build
--no-restore
--output artifacts/fork-release
/m:1
/p:BuildType=Full
/p:CI=false
/p:ForkPreview="$FORK_PREVIEW"
/p:ForkRelease="$FORK_RELEASE"
/p:ForkPack=true
/p:Version="$PACKAGE_VERSION"
/p:PackageVersion="$PACKAGE_VERSION"
)
dotnet pack DuckDB.NET.Bindings/Bindings.csproj "${common_args[@]}"

dotnet restore DuckDB.NET.Data/Data.csproj \
--source artifacts/fork-release \
--source https://api.nuget.org/v3/index.json \
/p:BuildType=Full \
/p:CI=false \
/p:ForkPreview="$FORK_PREVIEW" \
/p:ForkRelease="$FORK_RELEASE" \
/p:ForkPack=true \
/p:Version="$PACKAGE_VERSION" \
/p:PackageVersion="$PACKAGE_VERSION"

dotnet pack DuckDB.NET.Data/Data.csproj "${common_args[@]}"

- name: Validate and smoke-test packages
run: ./scripts/validate-fork-packages.sh artifacts/fork-release "$PACKAGE_VERSION"

- name: Generate checksums
working-directory: artifacts/fork-release
run: sha256sum *.nupkg > SHA256SUMS

- name: Upload workflow artifacts
uses: actions/upload-artifact@v7
with:
name: duckdb-net-${{ github.event.release.tag_name }}
path: |
artifacts/fork-release/*.nupkg
artifacts/fork-release/SHA256SUMS
if-no-files-found: error

- name: Attach packages to GitHub release
env:
GH_TOKEN: ${{ github.token }}
run: gh release upload "${{ github.event.release.tag_name }}" artifacts/fork-release/* --clobber

- name: Authenticate to NuGet.org
uses: NuGet/login@v1
id: nuget-login
with:
user: skuirrels

- name: Publish fork packages to NuGet.org
run: >-
dotnet nuget push "artifacts/fork-release/*.nupkg"
--api-key "${{ steps.nuget-login.outputs.NUGET_API_KEY }}"
--source https://api.nuget.org/v3/index.json
--skip-duplicate
8 changes: 4 additions & 4 deletions .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ jobs:

steps:
- name: "Checkout code"
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: "Run analysis"
uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
Expand All @@ -64,7 +64,7 @@ jobs:
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: SARIF file
path: results.sarif
Expand All @@ -73,6 +73,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard (optional).
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@v3
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: results.sarif
30 changes: 29 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,15 @@
<Company>Giorgi Dalakishvili</Company>
<Copyright>Copyright © 2020 - $(Year) Giorgi Dalakishvili</Copyright>

<ForkPackageBuild Condition="'$(ForkPreview)' == 'true' OR '$(ForkRelease)' == 'true'">true</ForkPackageBuild>
<ForkPackagePrefix Condition="'$(ForkPackageBuild)' == 'true' AND '$(ForkPackagePrefix)' == ''">Skuirrels.</ForkPackagePrefix>
<Product>DuckDB.NET.$(MSBuildProjectName)</Product>
<PackageId>DuckDB.NET.$(MSBuildProjectName)</PackageId>
<PackageId>$(ForkPackagePrefix)DuckDB.NET.$(MSBuildProjectName)</PackageId>
<PackageTags>DuckDB;ADO.NET;Database;Olap;Embedded</PackageTags>
<PackageIcon>Logo.jpg</PackageIcon>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageReadmeFile Condition="'$(ForkPreview)' == 'true'">README-PREVIEW.md</PackageReadmeFile>
<PackageReadmeFile Condition="'$(ForkRelease)' == 'true'">README-FORK.md</PackageReadmeFile>
<PackageLicenseExpression>MIT</PackageLicenseExpression>

<Deterministic>true</Deterministic>
Expand All @@ -38,6 +42,11 @@

</PropertyGroup>

<PropertyGroup Condition="'$(ForkPackageBuild)' == 'true'">
<RepositoryUrl>https://github.com/skuirrels/DuckDB.NET</RepositoryUrl>
<PackageProjectUrl>https://github.com/skuirrels/DuckDB.NET</PackageProjectUrl>
</PropertyGroup>

<PropertyGroup>
<BuildType>ManagedOnly</BuildType>
<NoNativeText>This package does not include a copy of the native DuckDB library.</NoNativeText>
Expand All @@ -63,8 +72,27 @@
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<None Include="..\README-PREVIEW.md" Condition="'$(ForkPreview)' == 'true'">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<None Include="..\README-FORK.md" Condition="'$(ForkRelease)' == 'true'">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
</ItemGroup>

<Target Name="ValidateForkPackageMetadata" BeforeTargets="Pack" Condition="'$(ForkPackageBuild)' == 'true'">
<Error Condition="'$(ForkPreview)' == 'true' AND '$(ForkRelease)' == 'true'"
Text="ForkPreview and ForkRelease cannot both be enabled." />
<Error Condition="$([System.String]::Copy('$(PackageId)').StartsWith('Skuirrels.')) != 'True'"
Text="Fork packages must use the Skuirrels package prefix." />
<Error Condition="'$(ForkPreview)' == 'true' AND $([System.String]::Copy('$(PackageVersion)').Contains('-preview.')) != 'True'"
Text="Fork preview package versions must contain the -preview. prerelease suffix." />
<Error Condition="'$(ForkRelease)' == 'true' AND $([System.String]::Copy('$(PackageVersion)').Contains('-')) == 'True'"
Text="Stable fork package versions must not contain a prerelease suffix." />
</Target>

<PropertyGroup Label="CI" Condition="'$(CI)' == ''">
<CI>false</CI>
<!-- GH, CircleCI, GitLab and BitBucket already use CI -->
Expand Down
Loading
Loading