[feature](lance) support lance catalog in doris - #65730
Conversation
|
Thank you for your contribution to Apache Doris. Please clearly describe your PR:
|
ce3b540 to
f760bd0
Compare
4dd1bee to
eb379a8
Compare
|
/review |
Gabriel39
left a comment
There was a problem hiding this comment.
I found several security and correctness issues that should be addressed before merging.
|
Codex automated review failed and did not complete. Error: Review step was failure (possibly timeout or cancelled) Please inspect the workflow logs and rerun the review after the underlying issue is resolved. |
There was a problem hiding this comment.
This adds a substantial Lance integration, but the current scan path still has blocking correctness, memory-safety, process-safety, security-display, snapshot-consistency, placement, and resource-governance defects. The inline comments identify thirteen distinct issues that remain after deduplicating against the four live comments already on the PR. Review was static-only as required; no build or test commands were run.
|
在这一版实现里,我们要把Postfilter改成Lance SDK 原生 Postfilter |
eb379a8 to
56d7904
Compare
|
run buildall |
c9a4827 to
70516cf
Compare
|
run buildall |
Cloud UT Coverage ReportIncrement line coverage Increment coverage report
|
|
run buildall |
Cloud UT Coverage ReportIncrement line coverage Increment coverage report
|
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
FE Regression Coverage ReportIncrement line coverage |
|
run buildall |
BE Regression && UT Coverage ReportIncrement line coverage Increment coverage report
|
…pache#66495) The vector_search() query path is algorithm-agnostic, but until now only flat search was actually exercised: the fixture from apache#65730 never created the vector index its tests claimed to cover (the referenced create_vector_search_index.py was never committed), so Lance silently fell back to flat KNN and the "IVF_PQ" regression proved nothing about indexes. This change adds verified IVF_FLAT query coverage and repairs the IVF_PQ fixture: - Add lance_build_preinstalled_catalog.py, an offline fixture generator pinned to pylance 4.0.1 (matching lance-c v0.1.2 / lance-rs 4.0.1). It builds the Directory V2 catalog through the namespace API (all_types re-registered, doris namespace, one indexed table per algorithm: vector_search_ivf_flat and vector_search_ivf_pq), then self-checks: Lance plans contain ANNSubIndex/ANNIvfPartition, indexes cover both fragments, IVF_FLAT full-probe equals flat search exactly, and the row-256 partition-boundary discriminator holds per table. The generated catalog (404K) is committed; the manifest is compacted back to one version/one data file. - Deterministic data: 1024 rows, two fragments, 16-dim Float32 with embedding[j] = (row_id - 1) + j, so a query equal to row r's vector has exact squared L2 distance 16 * (n - r)^2 to row n - integer ladder, tie-free at the endpoints, exact in Float32. - Rewrite test_lance_vector_search to target the real IVF_PQ table and add test_lance_vector_search_ivf_flat. Both suites carry a silent-fallback discriminator: querying the row-256 boundary with nprobes=1 must differ from the flat result (a pipeline that ignores the index returns exactly the flat rows and fails the assertion). IVF_FLAT additionally asserts indexed == flat programmatically (its algorithm guarantee); IVF_PQ freezes refine_factor-reranked results in goldens without claiming algorithm guarantees. - Remove run07_create_vector_types.sql and the stale golden output. Cross-version compatibility of the generated manifest was verified against lance-java 4.0.0 (lance-spark-bundle 0.4.0, runtime table registration) and lance-java 9.1.0-beta.3 (FE Directory Namespace client): both list, describe, register and deregister tables against it correctly. The remaining algorithms (IVF_SQ, IVF_HNSW_FLAT, IVF_HNSW_SQ, IVF_HNSW_PQ) follow the same pattern in follow-up PRs. Draft until the .out goldens are regenerated by a full docker regression run, which also provides the FE -> BE -> lance-c end-to-end evidence. Part of apache#66495. Claude-Session: https://claude.ai/code/session_014jKR13f5jdqs8NFyEuCnAN
…pache#66495) The vector_search() query path is algorithm-agnostic, but until now only flat search was actually exercised: the fixture from apache#65730 never created the vector index its tests claimed to cover (the referenced create_vector_search_index.py was never committed), so Lance silently fell back to flat KNN and the "IVF_PQ" regression proved nothing about indexes. This change adds verified IVF_FLAT query coverage and repairs the IVF_PQ fixture: - Add lance_build_preinstalled_catalog.py, an offline fixture generator pinned to pylance 4.0.1 (matching lance-c v0.1.2 / lance-rs 4.0.1). It builds the Directory V2 catalog through the namespace API (all_types re-registered, doris namespace, one indexed table per algorithm: vector_search_ivf_flat and vector_search_ivf_pq), then self-checks: Lance plans contain ANNSubIndex/ANNIvfPartition, indexes cover both fragments, IVF_FLAT full-probe equals flat search exactly, and the row-256 partition-boundary discriminator holds per table. The generated catalog (404K) is committed; the manifest is compacted back to one version/one data file. - Deterministic data: 1024 rows, two fragments, 16-dim Float32 with embedding[j] = (row_id - 1) + j, so a query equal to row r's vector has exact squared L2 distance 16 * (n - r)^2 to row n - integer ladder, tie-free at the endpoints, exact in Float32. - Rewrite test_lance_vector_search to target the real IVF_PQ table and add test_lance_vector_search_ivf_flat. Both suites carry a silent-fallback discriminator: querying the row-256 boundary with nprobes=1 must differ from the flat result (a pipeline that ignores the index returns exactly the flat rows and fails the assertion). IVF_FLAT additionally asserts indexed == flat programmatically (its algorithm guarantee); IVF_PQ freezes refine_factor-reranked results in goldens without claiming algorithm guarantees. - Remove run07_create_vector_types.sql and the stale golden output. Cross-version compatibility of the generated manifest was verified against lance-java 4.0.0 (lance-spark-bundle 0.4.0, runtime table registration) and lance-java 9.1.0-beta.3 (FE Directory Namespace client): both list, describe, register and deregister tables against it correctly. The remaining algorithms (IVF_SQ, IVF_HNSW_FLAT, IVF_HNSW_SQ, IVF_HNSW_PQ) follow the same pattern in follow-up PRs. Draft until the .out goldens are regenerated by a full docker regression run, which also provides the FE -> BE -> lance-c end-to-end evidence. Part of apache#66495. Claude-Session: https://claude.ai/code/session_014jKR13f5jdqs8NFyEuCnAN
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: N/A Related PR: #65730, #66581 Problem Summary: Ordinary Lance scans currently read **every row of a fragment** even when the query only needs the first N rows (e.g. `SELECT ... LIMIT 10`). Lance applies its own LIMIT *after* the scanner's filter, so the query LIMIT can be forwarded to each fragment scanner and let it stop early, cutting IO and decode cost. **How it is fixed** - `thrift`: add an optional `TLanceFileDesc.limit`. - `FE` (`LanceScanNode`): push the query limit into each fragment split via `canPushDownLimit()`, and surface `lanceLimit` in the explain output. - `BE` (`lance_reader`): forward it to the scanner through `lance_scanner_set_limit` for ordinary scans; vector search keeps its own `top_k` limit. **Correctness** The limit is pushed **only when all predicates are already pushed into Lance** (no residual Doris conjunct). Otherwise Doris still re-filters the returned rows, and truncating a fragment early could drop valid results. `OFFSET` needs no special handling: Nereids' `SplitLimit` rewrites `Limit(limit, offset)` into a global `Limit(limit, offset)` over a local `Limit(limit + offset, 0)`, and that local bound is what reaches the scan node. So `getLimit()` already includes the offset; each fragment fetches up to `limit + offset` rows and the upper global LIMIT still applies the offset and the final bound. Per-fragment truncation is therefore always safe. **Behavior change** Query results are unchanged. Only the number of rows scanned per fragment is reduced for LIMIT queries; the explain output shows an extra `lanceLimit=N` line when the limit is pushed. ### Release note Push down LIMIT into Lance fragment scanners to reduce the rows scanned for `LIMIT` / `LIMIT ... OFFSET` queries over Lance tables. ### Check List (For Author) - Test - [x] Unit Test (`LanceThriftContractTest` covers the limit round-trip and the no-limit case) - [ ] Manual test — `SELECT * FROM <lance_tbl> LIMIT 10` returns 10 rows and `EXPLAIN` shows `lanceLimit=10`; a query with a non-pushable predicate keeps the limit out of the scan - Behavior changed: - [x] No. - Does this need documentation? - [x] No.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: apache#66497 Related PR: apache#65730 Problem Summary: Lance external tables can contain logical vector and scalar indexes, but SHOW INDEX currently only handles internal OlapTable metadata and returns an empty result for Lance tables. Read authoritative logical index descriptions from one latest Directory Dataset snapshot, resolve field IDs from the same snapshot schema, and expose deterministic bounded metadata through the existing 13-column SHOW INDEX result without changing internal-table behavior. ### Release note Support SHOW INDEX for Lance filesystem/Directory Catalog tables. Lance REST index inspection remains unsupported in this phase. ### Check List (For Author) - Test: Unit Test and Regression test - Behavior changed: Yes. SHOW INDEX now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs. - Does this need documentation: Yes. Document the supported Directory-only scope and REST limitation.
### What problem does this PR solve? Issue Number: #66497 Related PR: #65730 Lance external tables can contain logical vector and scalar indexes, but `SHOW INDEX` currently only handles internal `OlapTable` metadata and returns an empty result for Lance tables. This change reads authoritative logical index descriptions from one latest Lance Directory Dataset snapshot, resolves field IDs against the schema from that same snapshot, and exposes deterministic, bounded metadata through the existing 13-column `SHOW INDEX` result without changing internal-table behavior. ### What changed? - Add immutable Lance logical-index metadata and a loader backed by one latest Dataset snapshot. - Support `SHOW INDEX`, `SHOW INDEXES`, `SHOW KEY`, and `SHOW KEYS` for Lance filesystem/Directory Catalog tables. - Preserve existing internal-table behavior and permission-check ordering (privilege check runs before any catalog initialization). - Return a fixed unsupported error for Lance REST catalogs in this phase. - Sanitize Dataset URI, storage credential, and REST secret values from index metadata errors. - Defensively reject non-Lance tables resolved from a Lance catalog instead of failing on a raw cast. - Add unit and regression coverage for normalization, formatting, permissions, aliases, empty-index tables, and error handling. ### Design walkthrough (diagrams) `SHOW INDEX` for Lance Directory tables is a small read pipeline whose main concern is object ownership across the JNI boundary: SDK objects (`Dataset`, `IndexDescription`, Arrow allocators) never escape the loader, and the command layer only sees immutable `LanceLogicalIndex` values. Layered view — three new classes (`LanceLogicalIndex`, `LanceIndexMetadataLoader`, `LanceMetadataReadExecutor`) and three touch points (`ShowIndexCommand`, `LanceExternalTable`, `LanceExternalCatalog`): ```mermaid flowchart TB subgraph CMD["Command layer · Nereids"] A["ShowIndexCommand<br/>analyze() privilege check (:83)<br/>handleShowIndex() dispatch (:111)<br/>buildLanceRows() row mapping (:159)"] end subgraph EXT["External table layer"] B["LanceExternalTable<br/>loadIndexMetadata() (:69) — thin delegate"] end subgraph CAT["Catalog layer · caller thread"] C["LanceExternalCatalog<br/>isRestCatalogConfigured() (:172) early REST rejection<br/>resolveTableAccess() (:371) namespace resolution"] C2["sanitizedRootCauseMessage() (:473)<br/>URI / credential / token redaction"] end subgraph BND["Execution boundary · lance-metadata-read pool"] D["LanceMetadataReadExecutor (:50)<br/>4 concurrent · 16 queued · deadline ≤ 60s"] E["LanceIndexMetadataLoader<br/>load() (:82) → normalize() (:206)"] end subgraph NAT["native · JNI"] F["Dataset.open(uri, latest)<br/>schema + describeIndices from one snapshot"] end G["LanceLogicalIndex<br/>immutable value object · pure-Java boundary"] A --> B --> C --> D --> E --> F E --> G C -.->|any failure| C2 C2 -.->|redacted exception only| A ``` Request timeline and resource ownership — namespace resolution stays on the caller thread (it owns the catalog's shared namespace/allocator), the JNI read runs on a bounded worker with a task-owned allocator, and a timed-out caller never cancels the in-flight native call: ```mermaid sequenceDiagram autonumber participant U as User participant C as Caller thread<br/>ShowIndexCommand participant K as Caller thread<br/>LanceExternalCatalog participant X as Executor<br/>boundary participant W as Worker thread<br/>lance-metadata-read participant J as Lance JNI<br/>Dataset U->>C: SHOW INDEX FROM lance_db.t C->>C: analyze() → checkTblPriv(SHOW) Note over C: privilege check runs before any catalog initialization C->>K: isRestCatalogConfigured() Note over K: reads normalized properties only, no namespace init —<br/>REST catalogs rejected here with a fixed error C->>K: resolveTableAccess() Note over K: shared namespace / allocator owned by the caller thread,<br/>so catalog close stays safe K-->>C: ResolvedTableAccess(uri, options) C->>X: execute(task) X->>W: submit (wrapped task checks deadline first) W->>W: expired in queue? fail before entering JNI W->>J: open(latest) + schema + describeIndices Note over W,J: task-owned RootAllocator (256MB) —<br/>catalog close cannot release it early J-->>W: IndexDescription + LanceSchema W-->>X: immutable index list X-->>C: future.get(remaining deadline) Note over C,X: timeout / interrupt never cancels the Future —<br/>the worker stays sole owner of native resources C->>C: buildLanceRows() → 13 columns C-->>U: ShowResultSet ``` Loader internals — one snapshot feeds both the schema mapping and the index descriptions; normalization is fail-closed and produces deterministic, bounded output: ```mermaid flowchart LR O["Dataset.open(uri, latest)<br/>index cache 0 · metadata cache 64MB<br/>schema and indexes from one snapshot"] O --> S["getLanceSchema().fields()"] O --> L["listIndexes()<br/>physical entries ≤ 16384"] subgraph SB["schema branch"] S --> DFS["buildFieldNamesById() (:148)<br/>DFS depth ≤ 64 · fields ≤ 16384<br/>field id → dotted path, quoted when needed"] end subgraph IB["index branch"] L --> FL["drop system indexes<br/>__lance_frag_reuse · __lance_mem_wal"] FL --> DD["dedupe by logical name ≤ 256"] DD --> CR["describeUserIndexes() (:95)<br/>per-name describeIndices(hasName)<br/>must return exactly 1, name must match"] end DFS --> V CR --> V subgraph NB["normalize() (:206) · fail-closed"] V["known, unique field ids<br/>columns ≤ 64 · names ≤ 16KB total"] --> P["details JSON allowlist<br/>TreeMap-sorted · ≤ 400B"] P --> R["exact duplicate names rejected<br/>sorted by (name, position)"] end R --> OUT["LanceLogicalIndex list<br/>immutable · deterministic"] ``` ### Fail-closed semantics (intentional) Three strict behaviors are deliberate and locked by unit tests — the command reports an error rather than showing potentially misleading metadata: - An index referencing an unknown or nested field ID fails the whole `SHOW INDEX` (`testRejectsUnknownNestedDuplicateNullAndEmptyFieldIds`). - One malformed index entry (invalid details JSON, oversize fields, duplicate name) fails the whole result instead of silently dropping rows (`testRejectsMalformedAndNonObjectJsonWithoutEchoingInput`). - Index names differing only by case are preserved as distinct entries; only exact duplicates are rejected (`testRejectsExactDuplicateNameButPreservesCaseOnlyNames`). ### User/developer impact Users can inspect logical Lance indexes through the standard 13-column `SHOW INDEX` interface for filesystem/Directory catalogs. Lance REST index inspection remains unsupported. ### Release note Support `SHOW INDEX` for Lance filesystem/Directory Catalog tables. ### Check List (For Author) - [x] Unit tests: 28 tests passed - [x] Full FE build: all 27 modules passed - [x] Lance regression test: generation and normal verification modes passed - [x] `git diff --check` - [x] Behavior changed: `SHOW INDEX` now returns logical indexes for Lance Directory tables and explicitly rejects Lance REST catalogs - [x] Documentation needed: document the supported Directory-only scope and REST limitation
Issue Number: close apache#66496 Related PR: apache#65730 Problem Summary: Lance schema discovery rejected Blob v2, Arrow JSON, BFloat16, Arrow null, and Arrow duration fields as unsupported. Add validated FE and BE mappings, materialize Blob payloads through lance-c, normalize BFloat16 values to FLOAT, preserve duration counts as BIGINT, and materialize Arrow null values safely. Support reading Lance Blob v2, Arrow JSON, BFloat16, null, and duration columns. - Test: Unit Test (added; not run locally at user request) - Behavior changed: Yes (the newly supported Lance columns are queryable) - Does this need documentation: Yes (type matrix is documented in the regression suite; user documentation follow-up is required)
What problem does this PR solve?
Issue #66340
Problem Summary:
doc: apache/doris-website#4024
This PR introduces read support for the Lance format in Doris, including:
None
Check List (For Author)
Test
Behavior changed:
Does this need documentation?
Check List (For Reviewer who merge this PR)