Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
229 changes: 56 additions & 173 deletions docs/parity-status.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# MobilityDuck parity status β€” surface-level audit

Generated 2026-05-10. **Active addressable scope** (temporal + geo, excluding PG-only helpers): 867/960 names covered (90.3%).
Generated 2026-05-11. **Active addressable scope** (temporal + geo, excluding PG-only helpers): 929/943 names covered (98.5%).

**Out of scope** (PG-only β€” no DuckDB equivalent exists): 303 names skipped β€” 84 from PG-only sections (GiST/SPGiST opclasses, set/span/spanset index files, `019_geo_constructors.in.sql` PG geometric types, `999_oid_cache.in.sql`) plus 219 PG helper functions inside active sections (`*_in/_out/_recv/_send`, `*_transfn/_combinefn/_finalfn/_serialize/_deserialize`, `*_sel/_joinsel/_supportfn/_analyze`, `*_typmod_in/_typmod_out`). Listed in appendix B; not counted in the headline.
**Out of scope** (PG-only β€” no DuckDB equivalent exists): 315 names skipped β€” 84 from PG-only sections (GiST/SPGiST opclasses, set/span/spanset index files, `019_geo_constructors.in.sql` PG geometric types, `999_oid_cache.in.sql`) plus 231 PG helper functions inside active sections (`*_in/_out/_recv/_send`, `*_transfn/_combinefn/_finalfn/_serialize/_deserialize`, `*_sel/_joinsel/_supportfn/_analyze`, `*_typmod_in/_typmod_out`). Listed in appendix B; not counted in the headline.

**Deferred families** (cbuffer, npoint, pose, rgeo) appear in appendix C and are also excluded from the headline.

Expand All @@ -20,45 +20,45 @@ Per-section counts: `Addressable` = MDB names minus PG-only helpers (see appendi

| Section | Addressable | Covered | Missing | Coverage | OOS | MDB operators |
|---|---:|---:|---:|---:|---:|---:|
| `geo/050_geoset.in.sql` | 43 | 31 | 12 | 72% | 13 | 46 |
| `geo/051_stbox.in.sql` | 75 | 59 | 16 | 79% | 8 | 29 |
| `geo/052_tgeo.in.sql` | 70 | 64 | 6 | 91% | 10 | 12 |
| `geo/052_tpoint.in.sql` | 70 | 66 | 4 | 94% | 8 | 12 |
| `geo/050_geoset.in.sql` | 42 | 41 | 1 | 98% | 13 | 46 |
| `geo/051_stbox.in.sql` | 73 | 70 | 3 | 96% | 10 | 29 |
| `geo/052_tgeo.in.sql` | 68 | 68 | 0 | 100% | 11 | 12 |
| `geo/052_tpoint.in.sql` | 69 | 69 | 0 | 100% | 9 | 12 |
| `geo/053_tgeo_inout.in.sql` | 18 | 18 | 0 | 100% | 0 | 0 |
| `geo/053_tpoint_inout.in.sql` | 18 | 18 | 0 | 100% | 0 | 0 |
| `geo/054_tgeo_compops.in.sql` | 6 | 6 | 0 | 100% | 1 | 36 |
| `geo/054_tpoint_compops.in.sql` | 6 | 6 | 0 | 100% | 0 | 36 |
| `geo/056_tgeo_spatialfuncs.in.sql` | 17 | 15 | 2 | 88% | 0 | 0 |
| `geo/056_tpoint_spatialfuncs.in.sql` | 30 | 24 | 6 | 80% | 0 | 0 |
| `geo/058_tgeo_tile.in.sql` | 5 | 2 | 3 | 40% | 0 | 0 |
| `geo/058_tpoint_tile.in.sql` | 11 | 8 | 3 | 73% | 0 | 0 |
| `geo/060_tgeo_boxops.in.sql` | 13 | 10 | 3 | 77% | 0 | 50 |
| `geo/060_tpoint_boxops.in.sql` | 13 | 10 | 3 | 77% | 0 | 50 |
| `geo/056_tgeo_spatialfuncs.in.sql` | 16 | 15 | 1 | 94% | 0 | 0 |
| `geo/056_tpoint_spatialfuncs.in.sql` | 28 | 27 | 1 | 96% | 1 | 0 |
| `geo/058_tgeo_tile.in.sql` | 5 | 4 | 1 | 80% | 0 | 0 |
| `geo/058_tpoint_tile.in.sql` | 11 | 10 | 1 | 91% | 0 | 0 |
| `geo/060_tgeo_boxops.in.sql` | 13 | 13 | 0 | 100% | 0 | 50 |
| `geo/060_tpoint_boxops.in.sql` | 13 | 13 | 0 | 100% | 0 | 50 |
| `geo/062_tgeo_posops.in.sql` | 16 | 16 | 0 | 100% | 0 | 76 |
| `geo/062_tpoint_posops.in.sql` | 16 | 16 | 0 | 100% | 0 | 76 |
| `geo/064_tgeo_distance.in.sql` | 4 | 4 | 0 | 100% | 0 | 16 |
| `geo/064_tpoint_distance.in.sql` | 4 | 4 | 0 | 100% | 0 | 21 |
| `geo/066_tpoint_similarity.in.sql` | 5 | 5 | 0 | 100% | 0 | 0 |
| `geo/068_tgeo_aggfuncs.in.sql` | 0 | 0 | 0 | 0% | 9 | 0 |
| `geo/068_tpoint_aggfuncs.in.sql` | 0 | 0 | 0 | 0% | 12 | 0 |
| `geo/070_tgeo_spatialrels.in.sql` | 14 | 11 | 3 | 79% | 0 | 0 |
| `geo/070_tpoint_spatialrels.in.sql` | 12 | 11 | 1 | 92% | 0 | 0 |
| `geo/072_tgeo_tempspatialrels.in.sql` | 6 | 5 | 1 | 83% | 0 | 0 |
| `geo/070_tgeo_spatialrels.in.sql` | 13 | 13 | 0 | 100% | 1 | 0 |
| `geo/070_tpoint_spatialrels.in.sql` | 11 | 11 | 0 | 100% | 1 | 0 |
| `geo/072_tgeo_tempspatialrels.in.sql` | 6 | 6 | 0 | 100% | 0 | 0 |
| `geo/072_tpoint_tempspatialrels.in.sql` | 5 | 5 | 0 | 100% | 0 | 0 |
| `geo/076_tgeo_analytics.in.sql` | 13 | 13 | 0 | 100% | 0 | 0 |
| `geo/076_tgeo_analytics.in.sql` | 12 | 12 | 0 | 100% | 0 | 0 |
| `geo/076_tpoint_analytics.in.sql` | 18 | 17 | 1 | 94% | 0 | 0 |
| `geo/078_tpoint_datagen.in.sql` | 1 | 0 | 1 | 0% | 0 | 0 |
| `temporal/001_set.in.sql` | 48 | 47 | 1 | 98% | 34 | 38 |
| `geo/078_tpoint_datagen.in.sql` | 0 | 0 | 0 | 0% | 1 | 0 |
| `temporal/001_set.in.sql` | 47 | 47 | 0 | 100% | 35 | 38 |
| `temporal/002_set_ops.in.sql` | 11 | 11 | 0 | 100% | 0 | 176 |
| `temporal/003_span.in.sql` | 46 | 45 | 1 | 98% | 22 | 30 |
| `temporal/003_span.in.sql` | 45 | 45 | 0 | 100% | 23 | 30 |
| `temporal/005_span_ops.in.sql` | 12 | 12 | 0 | 100% | 0 | 160 |
| `temporal/007_spanset.in.sql` | 61 | 60 | 1 | 98% | 20 | 30 |
| `temporal/009_spanset_ops.in.sql` | 14 | 13 | 1 | 93% | 0 | 280 |
| `temporal/007_spanset.in.sql` | 60 | 60 | 0 | 100% | 21 | 30 |
| `temporal/009_spanset_ops.in.sql` | 14 | 14 | 0 | 100% | 0 | 280 |
| `temporal/015_span_aggfuncs.in.sql` | 0 | 0 | 0 | 0% | 10 | 0 |
| `temporal/021_tbox.in.sql` | 52 | 52 | 0 | 100% | 8 | 21 |
| `temporal/022_temporal.in.sql` | 102 | 84 | 18 | 82% | 15 | 24 |
| `temporal/022_temporal.in.sql` | 101 | 101 | 0 | 100% | 16 | 24 |
| `temporal/023_temporal_inout.in.sql` | 16 | 16 | 0 | 100% | 0 | 0 |
| `temporal/025_temporal_tile.in.sql` | 16 | 10 | 6 | 62% | 0 | 0 |
| `temporal/025_temporal_tile.in.sql` | 16 | 11 | 5 | 69% | 0 | 0 |
| `temporal/026_tnumber_mathfuncs.in.sql` | 17 | 17 | 0 | 100% | 0 | 24 |
| `temporal/028_tbool_boolops.in.sql` | 4 | 4 | 0 | 100% | 0 | 7 |
| `temporal/029_ttext_textfuncs.in.sql` | 4 | 4 | 0 | 100% | 0 | 3 |
Expand All @@ -70,164 +70,46 @@ Per-section counts: `Addressable` = MDB names minus PG-only helpers (see appendi
| `temporal/040_temporal_aggfuncs.in.sql` | 0 | 0 | 0 | 0% | 40 | 0 |
| `temporal/042_temporal_waggfuncs.in.sql` | 0 | 0 | 0 | 0% | 8 | 0 |
| `temporal/046_temporal_analytics.in.sql` | 4 | 4 | 0 | 100% | 0 | 0 |
| **TOTAL (active)** | **960** | **867** | **93** | **90%** | **219** | β€” |
| **TOTAL (active)** | **943** | **929** | **14** | **99%** | **231** | β€” |

## Missing function names per active section

### `geo/050_geoset.in.sql` β€” 12 missing of 43 addressable (72% covered)

- `geogsetFromBinary`
- `geogsetFromEWKB`
- `geogsetFromEWKT`
- `geogsetFromHexWKB`
- `geogsetFromText`
- `geomsetFromBinary`
- `geomsetFromEWKB`
- `geomsetFromEWKT`
- `geomsetFromHexWKB`
- `geomsetFromText`
### `geo/050_geoset.in.sql` β€” 1 missing of 42 addressable (98% covered)

- `transformPipeline` (2 overloads)
- `unnest` (2 overloads)

### `geo/051_stbox.in.sql` β€” 16 missing of 75 addressable (79% covered)
### `geo/051_stbox.in.sql` β€” 3 missing of 73 addressable (96% covered)

- `box2d`
- `box3d`
- `geodstboxT` (2 overloads)
- `geodstboxZ`
- `geodstboxZT` (2 overloads)
- `geography`
- `perimeter`
- `quadSplit`
- `stboxFromHexWKB`
- `stboxT` (2 overloads)
- `stboxX`
- `stboxXT` (2 overloads)
- `stboxZ`
- `stboxZT` (2 overloads)
- `stbox_hash`
- `stbox_hash_extended`

### `geo/052_tgeo.in.sql` β€” 6 missing of 70 addressable (91% covered)

- `temporal_hash` (2 overloads)
- `tgeographySeqSet` (3 overloads)
- `tgeographySeqSetGaps`
- `tgeometrySeqSet` (3 overloads)
- `tgeometrySeqSetGaps`
- `unnest` (2 overloads)

### `geo/052_tpoint.in.sql` β€” 4 missing of 70 addressable (94% covered)

- `temporal_hash` (2 overloads)
- `tgeogpointSeqSetGaps`
- `tgeompointSeqSetGaps`
- `unnest` (2 overloads)

### `geo/056_tgeo_spatialfuncs.in.sql` β€” 2 missing of 17 addressable (88% covered)

- `tCentroid`

### `geo/056_tgeo_spatialfuncs.in.sql` β€” 1 missing of 16 addressable (94% covered)

- `transformPipeline` (2 overloads)

### `geo/056_tpoint_spatialfuncs.in.sql` β€” 6 missing of 30 addressable (80% covered)
### `geo/056_tpoint_spatialfuncs.in.sql` β€” 1 missing of 28 addressable (96% covered)

- `atElevation`
- `bearing` (8 overloads)
- `minusElevation`
- `tdirection` (2 overloads)
- `transformPipeline` (3 overloads)
- `transform_gk` (2 overloads)

### `geo/058_tgeo_tile.in.sql` β€” 3 missing of 5 addressable (40% covered)
### `geo/058_tgeo_tile.in.sql` β€” 1 missing of 5 addressable (80% covered)

- `spaceSplit` (3 overloads)
- `spaceTimeSplit` (3 overloads)
- `timeBoxes`

### `geo/058_tpoint_tile.in.sql` β€” 3 missing of 11 addressable (73% covered)
### `geo/058_tpoint_tile.in.sql` β€” 1 missing of 11 addressable (91% covered)

- `spaceSplit` (3 overloads)
- `spaceTimeSplit` (3 overloads)
- `timeBoxes`

### `geo/060_tgeo_boxops.in.sql` β€” 3 missing of 13 addressable (77% covered)

- `splitEachNStboxes` (2 overloads)
- `splitNStboxes` (2 overloads)
- `stboxes` (2 overloads)

### `geo/060_tpoint_boxops.in.sql` β€” 3 missing of 13 addressable (77% covered)

- `splitEachNStboxes` (4 overloads)
- `splitNStboxes` (4 overloads)
- `stboxes` (4 overloads)

### `geo/070_tgeo_spatialrels.in.sql` β€” 3 missing of 14 addressable (79% covered)

- `_edisjoint` (6 overloads)
- `aCovers` (3 overloads)
- `eCovers` (3 overloads)

### `geo/070_tpoint_spatialrels.in.sql` β€” 1 missing of 12 addressable (92% covered)

- `_edisjoint` (6 overloads)

### `geo/072_tgeo_tempspatialrels.in.sql` β€” 1 missing of 6 addressable (83% covered)

- `tCovers` (3 overloads)

### `geo/076_tpoint_analytics.in.sql` β€” 1 missing of 18 addressable (94% covered)

- `geography` (2 overloads)

### `geo/078_tpoint_datagen.in.sql` β€” 1 missing of 1 addressable (0% covered)

- `create_trip`

### `temporal/001_set.in.sql` β€” 1 missing of 48 addressable (98% covered)

- `unnest` (6 overloads)

### `temporal/003_span.in.sql` β€” 1 missing of 46 addressable (98% covered)

- `range` (4 overloads)

### `temporal/007_spanset.in.sql` β€” 1 missing of 61 addressable (98% covered)

- `multirange` (4 overloads)

### `temporal/009_spanset_ops.in.sql` β€” 1 missing of 14 addressable (93% covered)

- `time_distance` (5 overloads)

### `temporal/022_temporal.in.sql` β€” 18 missing of 102 addressable (82% covered)

- `tboolInst`
- `tboolSeq` (2 overloads)
- `tboolSeqSet` (2 overloads)
- `tboolSeqSetGaps`
- `temporal_hash` (4 overloads)
- `tfloatInst`
- `tfloatSeq` (2 overloads)
- `tfloatSeqSet` (2 overloads)
- `tfloatSeqSetGaps`
- `tintInst`
- `tintSeq` (2 overloads)
- `tintSeqSet` (2 overloads)
- `tintSeqSetGaps`
- `ttextInst`
- `ttextSeq` (2 overloads)
- `ttextSeqSet` (2 overloads)
- `ttextSeqSetGaps`
- `unnest` (3 overloads)

### `temporal/025_temporal_tile.in.sql` β€” 6 missing of 16 addressable (62% covered)
### `temporal/025_temporal_tile.in.sql` β€” 5 missing of 16 addressable (69% covered)

- `timeBins` (4 overloads)
- `timeBoxes` (2 overloads)
- `valueBins` (2 overloads)
- `valueBoxes` (2 overloads)
- `valueSplit` (2 overloads)
- `valueTimeBoxes` (2 overloads)

## Appendix B β€” Out of scope (PG-only, no DuckDB equivalent)
Expand All @@ -254,18 +136,22 @@ These entries are PG-specific helpers β€” index opclasses, aggregate transition/
| Section | PG helpers |
|---|---:|
| `geo/050_geoset.in.sql` | 13 |
| `geo/051_stbox.in.sql` | 8 |
| `geo/052_tgeo.in.sql` | 10 |
| `geo/052_tpoint.in.sql` | 8 |
| `geo/051_stbox.in.sql` | 10 |
| `geo/052_tgeo.in.sql` | 11 |
| `geo/052_tpoint.in.sql` | 9 |
| `geo/054_tgeo_compops.in.sql` | 1 |
| `geo/056_tpoint_spatialfuncs.in.sql` | 1 |
| `geo/068_tgeo_aggfuncs.in.sql` | 9 |
| `geo/068_tpoint_aggfuncs.in.sql` | 12 |
| `temporal/001_set.in.sql` | 34 |
| `temporal/003_span.in.sql` | 22 |
| `temporal/007_spanset.in.sql` | 20 |
| `geo/070_tgeo_spatialrels.in.sql` | 1 |
| `geo/070_tpoint_spatialrels.in.sql` | 1 |
| `geo/078_tpoint_datagen.in.sql` | 1 |
| `temporal/001_set.in.sql` | 35 |
| `temporal/003_span.in.sql` | 23 |
| `temporal/007_spanset.in.sql` | 21 |
| `temporal/015_span_aggfuncs.in.sql` | 10 |
| `temporal/021_tbox.in.sql` | 8 |
| `temporal/022_temporal.in.sql` | 15 |
| `temporal/022_temporal.in.sql` | 16 |
| `temporal/030_temporal_compops.in.sql` | 1 |
| `temporal/040_temporal_aggfuncs.in.sql` | 40 |
| `temporal/042_temporal_waggfuncs.in.sql` | 8 |
Expand All @@ -278,19 +164,19 @@ These families (cbuffer, npoint, pose, rgeo) are deferred until the active tempo
|---|---:|---:|---:|---:|
| `cbuffer/150_cbuffer.in.sql` | 31 | 7 | 24 | 23% |
| `cbuffer/151_cbufferset.in.sql` | 42 | 32 | 10 | 76% |
| `cbuffer/152_tcbuffer.in.sql` | 84 | 65 | 19 | 77% |
| `cbuffer/152_tcbuffer.in.sql` | 84 | 66 | 18 | 79% |
| `cbuffer/154_tcbuffer_compops.in.sql` | 6 | 6 | 0 | 100% |
| `cbuffer/155_tcbuffer_spatialfuncs.in.sql` | 11 | 8 | 3 | 73% |
| `cbuffer/155_tcbuffer_spatialfuncs.in.sql` | 9 | 6 | 3 | 67% |
| `cbuffer/158_tcbuffer_topops.in.sql` | 7 | 7 | 0 | 100% |
| `cbuffer/159_tcbuffer_posops.in.sql` | 12 | 12 | 0 | 100% |
| `cbuffer/160_tcbuffer_distance.in.sql` | 5 | 4 | 1 | 80% |
| `cbuffer/161_tcbuffer_aggfuncs.in.sql` | 7 | 0 | 7 | 0% |
| `cbuffer/162_tcbuffer_spatialrels.in.sql` | 13 | 11 | 2 | 85% |
| `cbuffer/164_tcbuffer_tempspatialrels.in.sql` | 6 | 5 | 1 | 83% |
| `cbuffer/162_tcbuffer_spatialrels.in.sql` | 13 | 13 | 0 | 100% |
| `cbuffer/164_tcbuffer_tempspatialrels.in.sql` | 6 | 6 | 0 | 100% |
| `cbuffer/166_tcbuffer_indexes.in.sql` | 1 | 0 | 1 | 0% |
| `npoint/081_npoint.in.sql` | 41 | 8 | 33 | 20% |
| `npoint/082_npointset.in.sql` | 43 | 30 | 13 | 70% |
| `npoint/083_tnpoint.in.sql` | 77 | 61 | 16 | 79% |
| `npoint/083_tnpoint.in.sql` | 77 | 62 | 15 | 81% |
| `npoint/085_tnpoint_compops.in.sql` | 6 | 6 | 0 | 100% |
| `npoint/087_tnpoint_spatialfuncs.in.sql` | 12 | 11 | 1 | 92% |
| `npoint/089_tnpoint_topops.in.sql` | 7 | 7 | 0 | 100% |
Expand All @@ -302,25 +188,22 @@ These families (cbuffer, npoint, pose, rgeo) are deferred until the active tempo
| `npoint/098_tnpoint_indexes.in.sql` | 1 | 0 | 1 | 0% |
| `pose/100_pose.in.sql` | 34 | 10 | 24 | 29% |
| `pose/101_poseset.in.sql` | 46 | 33 | 13 | 72% |
| `pose/102_tpose.in.sql` | 85 | 64 | 21 | 75% |
| `pose/102_tpose.in.sql` | 84 | 65 | 19 | 77% |
| `pose/104_tpose_compops.in.sql` | 6 | 6 | 0 | 100% |
| `pose/105_tpose_spatialfuncs.in.sql` | 8 | 7 | 1 | 88% |
| `pose/108_tpose_topops.in.sql` | 7 | 7 | 0 | 100% |
| `pose/109_tpose_posops.in.sql` | 16 | 16 | 0 | 100% |
| `pose/111_tpose_aggfuncs.in.sql` | 7 | 0 | 7 | 0% |
| `pose/113_tpose_distance.in.sql` | 4 | 4 | 0 | 100% |
| `pose/114_tpose_indexes.in.sql` | 1 | 0 | 1 | 0% |
| `rgeo/122_trgeo.in.sql` | 95 | 75 | 20 | 79% |
| `rgeo/122_trgeo.in.sql` | 83 | 65 | 18 | 78% |
| `rgeo/124_trgeo_compops.in.sql` | 6 | 6 | 0 | 100% |
| `rgeo/125_trgeo_spatialfuncs.in.sql` | 8 | 7 | 1 | 88% |
| `rgeo/126_trgeo_tile.in.sql` | 3 | 3 | 0 | 100% |
| `rgeo/127_trgeo_boxops.in.sql` | 13 | 8 | 5 | 62% |
| `rgeo/125_trgeo_spatialfuncs.in.sql` | 4 | 3 | 1 | 75% |
| `rgeo/128_trgeo_topops.in.sql` | 5 | 5 | 0 | 100% |
| `rgeo/129_trgeo_posops.in.sql` | 16 | 16 | 0 | 100% |
| `rgeo/131_trgeo_aggfuncs.in.sql` | 8 | 0 | 8 | 0% |
| `rgeo/132_trgeo_similarity.in.sql` | 5 | 5 | 0 | 100% |
| `rgeo/129_trgeo_posops.in.sql` | 12 | 12 | 0 | 100% |
| `rgeo/131_trgeo_aggfuncs.in.sql` | 7 | 0 | 7 | 0% |
| `rgeo/133_trgeo_distance.in.sql` | 4 | 4 | 0 | 100% |
| `rgeo/133_trgeo_vclip.in.sql` | 6 | 0 | 6 | 0% |
| `rgeo/134_trgeo_indexes.in.sql` | 1 | 0 | 1 | 0% |
| **TOTAL (deferred)** | **827** | **572** | **255** | **69%** |
| **TOTAL (deferred)** | **782** | **542** | **240** | **69%** |

Loading
Loading