Skip to content

feat(plugin-qdrant): add a Qdrant driver over the REST API - #3972

Merged
datlechin merged 23 commits into
TableProApp:mainfrom
J2TeamNNL:feat/plugin-qdrant
Nov 1, 2026
Merged

datlechin merged 23 commits into
TableProApp:mainfrom
J2TeamNNL:feat/plugin-qdrant

Conversation

@J2TeamNNL

@J2TeamNNL J2TeamNNL commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • New registry plugin QdrantDriverPlugin over Qdrant's REST API, with its wire code in the PluginKit-free product TableProQdrantCore.
  • Connection: host, port 6333, an API key sent as api-key, SSH tunnel, and SSL modes. Verify CA checks the chain to the chosen CA and that the certificate is a server's; Verify Identity also checks the hostname, against the system trust store when no CA is chosen (Qdrant Cloud). A client certificate and key are sent for mutual TLS.
  • Collections in the sidebar, points as rows: id first and read-only, payload fields, then one column per vector (vector, vector.<name>), typed vector(<size>), multivector or sparse_vector. Nested index paths such as metadata.source are listed as indexes, not columns.
  • A cell is typed by what points store, widened by each page. A column holding mixed types is json, and its text shows quoted, so a value saves back as the type it had.
  • Pages come from the Query API in id order with the offset applied by Qdrant (1.10+); an older node walks ids from the start. No cursor is cached, so a page is right after another client's changes.
  • Sorting by one payload field with a range index: ordered points, then points without a value by id, so every point is reachable and the count matches. id descending, vectors, several sort columns, a field without a range index and a field holding lists are refused with a message. The app's default sort is suppressed.
  • Filters quote keys and match every type a value spells: 42 finds "42", 42 and 42.0. IS NULL is is_empty, IS EMPTY adds "", CONTAINS is match.text on any field.
  • Edits go through generateRowWrites, typed by the column types the grid read:
    • Payload cells: set-payload.
    • Vector cells: update vectors, or delete one when set to NULL.
    • Inserts: an update_filter that matches no point, plus a lookup that refuses a taken id and a check after the write. Qdrant 1.15 or later is required, since older nodes overwrite.
    • A value that does not fit its column refuses the save instead of being written as text.
  • The REST editor takes a body on the request line, under it, or both. A point list renders as a grid with score.
  • QueryClassifier uses the core's parser and route table, so the gate and the driver read the same request. /collections/{name}/facet is a read, snapshot routes are matched by position, and a payload overwrite, the cluster route and the aliases route rank as destructive, since they delete through the body.
  • Fixed beside it:
    • typesenseRequestLine split on a space only, so DELETE<tab>/v1/schema/X ranked as a write on Weaviate.
    • The Weaviate gate read the inline body while the driver sent the lines below.
    • Trino's Verify CA accepted a client-only certificate.
    • A row lookup that expects no row now says the key is taken.
  • Probe apple/scripts/probes/check-qdrant.sh runs the core against a live node.

Docs: TableProApp/docs#151

Test plan

  • swift test --filter TableProQdrantCoreTests: 55 cases. TableProTLSClientIdentityTests and TableProTrinoCoreTests pass.
  • Hosted: QueryClassifierNonSqlTests (Qdrant tiers, facet, tab and split-body cases for Qdrant and Weaviate), DataWriteExecutorLookupTests (taken key), ExternalStatementGatePrivateRequestTests and the parameterized suites that list Qdrant: 118 cases pass.
  • apple/scripts/probes/check-qdrant.sh against qdrant/qdrant 1.20.0: 50 checks pass, including an insert that loses a race, paging after another client's delete, and a datetime sort. update_filter measured on 1.13.6, 1.14.1, 1.15.5, 1.16.3 and 1.20.0.
  • QdrantDriverPlugin, TrinoDriverPlugin and WeaviateDriverPlugin schemes build.

Fixes #3600

@datlechin
datlechin enabled auto-merge (squash) November 1, 2026 09:10
DatabaseTypeTests: allKnownTypes is 35 once StarRocks (main) and Qdrant (this branch) are both in it.
# Conflicts:
#	apple/Packages/TableProCore/Sources/TableProConnectionLibrary/SQLDDLFallbackPolicy.swift
#	apple/Packages/TableProCore/Sources/TableProCoreTypes/DatabaseType.swift
#	apple/Packages/TableProCore/Sources/TableProSQLGrammar/SQLLexicalProfile.swift
#	apple/Packages/TableProCore/Tests/TableProModelsTests/DatabaseTypeTests.swift
#	apple/TablePro/Core/Plugins/PluginMetadataRegistry+RegistryDefaults.swift
#	apple/TablePro/Core/Services/Execution/ExternalStatementGate.swift
#	apple/TablePro/Core/Utilities/SQL/QueryClassifier.swift
#	apple/TablePro/Models/Connection/DatabaseType.swift
#	apple/TableProTests/Core/Execution/ExternalStatementGatePrivateRequestTests.swift
#	apple/TableProTests/Core/Plugins/PluginMetadataRegistryTypeCountTests.swift
#	apple/TableProTests/Core/Services/Query/AllTablesListingTests.swift
#	apple/TableProTests/Core/Utilities/SQL/QueryClassifierHardeningTests.swift
#	apple/TableProTests/Models/Query/QueryTabBaseQueryTests.swift
#	apple/TableProTests/Views/Main/QueryParameterDetectionTests.swift
… and TLS

Measured against Qdrant 1.20.0 (apple/scripts/probes/check-qdrant.sh).
…d search, drop cursors after outside changes
# Conflicts:
#	apple/Packages/TableProCore/Package.swift
#	apple/TablePro/Core/Plugins/PluginMetadataRegistry+RegistryDefaults.swift
#	apple/TablePro/Core/Utilities/SQL/CatalogChangeClassifier.swift
#	apple/TableProTests/Core/Plugins/PluginMetadataRegistryTypeCountTests.swift
#	apple/project.yml
@datlechin
datlechin merged commit cad4d67 into TableProApp:main Nov 1, 2026
8 checks passed
datlechin added a commit that referenced this pull request Nov 2, 2026
* fix(security): tier SQL with one classifier for macOS and iOS

Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-7WQZ7IBV.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-85FM8CNF.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-BO7086MJ.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-DXB5GXHF.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-RSL7CZQC.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-TUTSEW23.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-VEO0AP8A.
Advisory: GHSA-3x6q-h487-r38w

* fix(linux-grid): stop column moves at the row numbers, keep the focus in view and announce them (#3985)

* feat(linux-sidebar): list functions, procedures, sequences and triggers (#3969)

Co-authored-by: Ngo Quoc Dat <datlechin@gmail.com>

* feat(plugin-influxdb): add an InfluxDB 2 and 3 driver over HTTP (#3976)

Co-authored-by: Ngo Quoc Dat <datlechin@gmail.com>

* feat(plugin-qdrant): add a Qdrant driver over the REST API (#3972)

Co-authored-by: Ngo Quoc Dat <datlechin@gmail.com>

* feat(display-format): decode Protobuf schemas and Schema Registry values (#3979)

Co-authored-by: Ngo Quoc Dat <datlechin@gmail.com>

* refactor(core): move the Linux core crates into a shared core workspace (#3986)

* fix(security): import TableProSQLGrammar where the Flux classifier reads its tiers

* docs(core): record the bindings, grid data, plugin ABI and SQL Server decisions (#3987)

* fix(licensing): call the paid plan Pro, as the site and server now do (#3989)

* fix(parsing): stop malformed replies and files from crashing, hanging or filling memory (#3991)

---------

Co-authored-by: Nguyễn Nam Long <j2teamnnl@gmail.com>
datlechin added a commit that referenced this pull request Nov 2, 2026
* fix(security): tier SQL with one classifier for macOS and iOS

Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-7WQZ7IBV.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-85FM8CNF.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-BO7086MJ.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-DXB5GXHF.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-RSL7CZQC.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-TUTSEW23.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-VEO0AP8A.
Advisory: GHSA-3x6q-h487-r38w

* fix(security): run external statements as approved and read only in the engine

Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-AK0DTFEV.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-2N5FN7X4.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-A6ENWH1O.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-AWAVHFV6.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-DRI3Z3MD.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-G0F69IT6.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-KIUNV39X.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-KYD5T4TJ.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-LG65P706.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-P5IW81B3.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-PCUF2R3V.
Discovered by Anthropic's OSS Scanner, as vulnerability ANT-2026-UHVIMOF0.
Advisory: GHSA-3xf7-86qj-4546

* fix(l10n): add the iOS strings the MongoDB and ClickHouse refusals use

* fix(linux-clickhouse): hold user SQL and read-only connections to readonly=1

readonly=2 still let INSERT INTO FUNCTION file() write a file on the server (measured on 26.8).

Advisory: GHSA-3xf7-86qj-4546

* feat(plugin-influxdb): add an InfluxDB 2 and 3 driver over HTTP (#3976)

Co-authored-by: Ngo Quoc Dat <datlechin@gmail.com>

* feat(plugin-qdrant): add a Qdrant driver over the REST API (#3972)

Co-authored-by: Ngo Quoc Dat <datlechin@gmail.com>

* feat(display-format): decode Protobuf schemas and Schema Registry values (#3979)

Co-authored-by: Ngo Quoc Dat <datlechin@gmail.com>

* refactor(core): move the Linux core crates into a shared core workspace (#3986)

* fix(security): import TableProSQLGrammar where the Flux classifier reads its tiers

* fix(security): import TableProSQLGrammar where the gates read the shared classifier's tier

* docs(core): record the bindings, grid data, plugin ABI and SQL Server decisions (#3987)

* fix(licensing): call the paid plan Pro, as the site and server now do (#3989)

* fix(parsing): stop malformed replies and files from crashing, hanging or filling memory (#3991)

---------

Co-authored-by: Nguyễn Nam Long <j2teamnnl@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Qdrant driver

2 participants