Inheritance & shared plugin

Chain: DuckDBDataSource → InMemoryRDBSource → RDBSource (partial classes under RDBMSDataSource/PartialClasses/RDBSource/). Dialect-specific SQL still flows through IDataSourceHelper for DataSourceType.DuckDB where BeepDM registers templates.

For the full list of engines on RDBSource and how helpers fit in, read RDBMS family overview.

Registration

  • DataSourceType: DuckDB
  • Category: INMEMORY

NuGet (see csproj)

DuckDB.NET.Bindings.Full, DuckDB.NET.Data.Full, plus Beep packages in DuckDBDataSourceCore.csproj.

Delimiters & connection wiring

The constructor sets ColumnDelimiter = "[]" and ParameterDelimiter = "$" (DuckDB-style). It uses RDBDataConnection from the shared plugin and binds ConnectionProperties from the editor by connection name, with DatabaseType = DataSourceType.DuckDB.

File readers

The project registers DuckDB-backed readers for several file types (for example Parquet, JSON, TSV). Registration helpers live in FileReaders/DuckDbFileReaderRegistration.cs (RegisterNonConflicting, RegisterAllPrimaryFormats). NDJSON/JSONL uses DataSourceType.FlatFile so it does not replace the default JSON reader—see in-repo comments on DuckDbNdjsonFileReader.

Extended commands (DuckDbExtendedFunctions)

Discoverable UI functions are defined on a partial DuckDBDataSource in InMemoryDB/DuckDBDataSourceCore/DuckDbExtendedFunctions.cs. Each method uses [CommandAttribute(..., DatasourceType = DataSourceType.DuckDB, ClassType = "DuckDbExtendedFunctions")] so the editor can list them alongside standard IDataSource operations. The table below is the full set as of the current source (36 commands).

Name (attribute)C# methodReturn
CreateSequenceCreateSequence(sequenceName, start, increment, minValue, maxValue, cycle)void
CreateOrReplaceViewCreateOrReplaceView(viewName, viewQuerySql)void
ImportFromMultipleCsvFilesImportFromMultipleCsvFiles(tableName, filePattern, union_by_name)void — read_csv_auto glob
ImportFromMultipleParquetFilesImportFromMultipleParquetFiles(tableName, filePattern)void — parquet_scan
ImportCSVImportCSV(filePath, tableName, createTable)void — COPY or CREATE AS read_csv_auto
ExportToCSVExportToCSV(tableName, filePath)void
ImportParquetIntoExistingTableImportParquetIntoExistingTable(filePath, tableName)void
ImportParquetImportParquet(filePath, tableName)void — CREATE TABLE AS read_parquet
ImportJsonImportJson(filePath, tableName, parameters)void
ExportJsonExportJson(filePath, tableName)void — see source SQL
ImportJsonIntoExistingTableImportJsonIntoExistingTable(filePath, tableName)void
ExportToParquetExportToParquet(tableName, filePath)void
ExportQueryResultToParquetExportQueryResultToParquet(query, filePath)void
ExecuteParameterizedQueryExecuteParameterizedQuery(sql, parameters)DataTable
ExportToPartitionedParquetExportToPartitionedParquet(tableName, directoryPath, partitionColumn)void
ExportQueryToPartitionedParquetExportQueryToPartitionedParquet(query, directoryPath, partitionColumns)void
ExecuteNonQueryExecuteNonQuery(sql)int
GetScalarValueGetScalarValue(sql)object
TableExistsTableExists(tableName)bool
DropTableDropTable(tableName)void
PrintQueryResultsPrintQueryResults(queryResult)void — console; DuckDBResult
ParquetMetaDataParquetMetaData(filePath)DataTable — parquet_metadata
ReadTextFileReadTextFile(filePath)DataTable — read_text
ReadParquetFileReadParquetFile(filepath, binaryAsString, filename, fileRowNumber, hivePartitioning, unionByName)DataTable
ReadMultipleCSVFilesReadMultipleCSVFiles(filePaths, union_by_name, filename)DataTable
JSONLoadJSONLoad(filepath, …many options…)DataTable — json_read
CSVLoadCSVLoad(filepath, …many options…)DataTable — read_csv_auto
InstallExtensionInstallExtension(extensionName)void — INSTALL
LoadExtensionLoadExtension(extensionName)void — LOAD
AttachDatabaseAttachDatabase(dbPath, alias, type)void — ATTACH
DetachDatabaseDetachDatabase(alias)void
ExportDatabaseExportDatabase(directoryPath)void — EXPORT DATABASE
ImportDatabaseImportDatabase(directoryPath)void — IMPORT DATABASE
SniffCSVSniffCSV(filepath)DataTable — sniff_csv
SummarizeTableSummarizeTable(tableName)DataTable — SUMMARIZE
SetMemoryLimitSetMemoryLimit(limit)void — PRAGMA memory_limit

Caption and ObjectType (from CommandAttribute)

Same commands as above, in Order sequence as declared in DuckDbExtendedFunctions.cs (for UI grouping / discovery).

OrderNameCaptionObjectType
1CreateSequenceCreate SequenceSequence
2CreateOrReplaceViewCreate Or Replace ViewView
3ImportFromMultipleCsvFilesImport Multiple CSVsTable
4ImportFromMultipleParquetFilesImport Multiple ParquetsTable
5ImportCSVImport CSVTable
6ExportToCSVExport To CSVFile
7ImportParquetIntoExistingTableImport Parquet To TableTable
8ImportParquetImport ParquetTable
9ImportJsonImport JSONTable
10ExportJsonExport JSONTable
11ImportJsonIntoExistingTableImport JSON To TableTable
12ExportToParquetExport To ParquetTable
13ExportQueryResultToParquetExport Query To ParquetQuery
14ExecuteParameterizedQueryExecute Parameterized QueryQuery
15ExportToPartitionedParquetExport To Partitioned ParquetTable
16ExportQueryToPartitionedParquetExport Query To Partitioned ParquetQuery
17ExecuteNonQueryExecute Non QueryQuery
18GetScalarValueGet Scalar ValueQuery
19TableExistsTable ExistsTable
20DropTableDrop TableTable
21PrintQueryResultsPrint Query ResultsQuery
22ParquetMetaDataParquet Meta DataTable
23ReadTextFileRead Text FileTable
24ReadParquetFileRead Parquet FileTable
25ReadMultipleCSVFilesRead Multiple CSV FilesTable
26JSONLoadJSON LoadTable
27CSVLoadCSV LoadTable
28InstallExtensionInstall ExtensionExtension
29LoadExtensionLoad ExtensionExtension
30AttachDatabaseAttach DatabaseDatabase
31DetachDatabaseDetach DatabaseDatabase
32ExportDatabaseExport DatabaseDatabase
33ImportDatabaseImport DatabaseDatabase
34SniffCSVSniff CSVTable
35SummarizeTableSummarize TableTable
36SetMemoryLimitSet Memory LimitMemory

Parameter names and defaults match the C# signatures in DuckDbExtendedFunctions.cs. For full argument lists (especially JSONLoad and CSVLoad), use the source file. Standard entity CRUD and metadata still come from RDBSource / IDataSource.

In-memory workflow

Follow IInMemoryDB patterns from BeepDM/.cursor/inmemorydb: open store, load/create structure, then load or sync data. Validate ConnectionStatus before heavy ETL.

Also read