Skip to content

feat: implement postgres style table partitioning - #776

Open
adsharma wants to merge 2 commits into
mainfrom
partioned_tables
Open

feat: implement postgres style table partitioning#776
adsharma wants to merge 2 commits into
mainfrom
partioned_tables

Conversation

@adsharma

@adsharma adsharma commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Idea: store partitioned tables in subgraphs which could live on object storage and/or accessed via a columnar network protocol.

-- Hash partitioning on an eligible column.
CREATE NODE TABLE Orders (
    id     INT64  PRIMARY KEY,
    region STRING,
    amount INT64
) PARTITION BY HASH (region) PARTITIONS 4;

-- Range partitioning (bounds are derived; see design below).
CREATE NODE TABLE Events (
    id    INT64 PRIMARY KEY,
    ts    TIMESTAMP,
    value DOUBLE
) PARTITION BY RANGE (ts) PARTITIONS 5;

Each partition lives in a separate subgraph which can be dropped independently.

@adsharma
adsharma force-pushed the partioned_tables branch 3 times, most recently from 9b71128 to c5d4bae Compare August 4, 2026 02:07
@adsharma
adsharma force-pushed the partioned_tables branch 2 times, most recently from 815f03c to f771009 Compare August 18, 2026 19:12
… storage

Add declarative RANGE/HASH partitioning to CREATE NODE TABLE:

    CREATE NODE TABLE t (...) PARTITION BY (HASH|RANGE) (col) PARTITIONS n;

Each partition is backed by its own node-table subgraph (<t>_p<i>); the
logical parent owns the schema but no physical storage. Reads on the parent
(MATCH) transparently union over every partition via the existing multi-table
node scan. Writes to the parent (COPY/CREATE/MERGE) raise an actionable error
until routing lands; the partition subgraphs are directly writable.

- Parser: PARTITION BY clause + new keywords (regenerated grammar)
- Catalog: parent + partition subgraph entries, persistence (storage v44),
  DROP cascade
- Storage: parents skipped in create/checkpoint/serialize/rollback; partitions
  managed as ordinary node tables
- Query: expand parent label to partition subgraphs for scanning
- Validation: partition column must be an eligible existing column
- Tests: ddl/partitioned.test (5 cases) pass
- Docs: docs/partitioning.md with architecture and roadmap (write routing,
  pruning, ADBC remote partitions)
…r node table

CREATE, COPY and MERGE into a partitioned parent now evaluate each row's
partition key and route it into the matching partition subgraph
(hash(value) % numPartitions, used for HASH and, until declarative range
bounds land, RANGE partitions). Single-row inserts route at runtime in
NodeInsertExecutor; batched COPY routes consecutive same-partition runs in
NodeBatchInsert. Each child is an ordinary NodeTable, so primary-key
uniqueness and WAL/MVCC apply per partition.

Every node table is now backed by a subgraph (a GraphCatalogEntry in the
catalog's `graphs` set), so SHOW_GRAPHS lists node tables and their
partition subgraphs. Subgraphs are created and dropped with their table
(creation skips WAL logging since the table's create record implies them),
follow ALTER TABLE ... RENAME, and DROP GRAPH refuses a node-table subgraph.

Adds NodePartitionWriteInfo routing metadata carried from the binder through
NodeBatchInsertInfo, updates docs/partitioning.md, and extends the
partitioned e2e test with write-routing and show_graphs coverage.
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.

1 participant