Description
Implement the DISJOIN expander, which produces the WITH-CTE structure as standard AST, with the full-row passthrough and the output de-canonicalization of disjoin_start and disjoin_end expressed as AST, dissolving the emit-time string special-case left by epic #114. Make the canonicalization output capability-driven: an explicit portable projection for targets without supports_star_replace such as DataFusion, and SELECT * REPLACE for targets that support it such as DuckDB. Flip GIQL_EXPAND on GIQLDisjoin and delete giqldisjoin_sql.
Motivation
DISJOIN is the largest operator and the one that closes the star-REPLACE portability gap for non-canonical encodings documented in #122, making non-canonical data work on engines that lack REPLACE.
Expected Outcome
DISJOIN transpiles through the registry; non-canonical encodings produce portable SQL on DataFusion and REPLACE SQL on DuckDB, both with identical results under the coordinate-space and usage-pattern result oracles run on both engines; giqldisjoin_sql is removed.
Description
Implement the DISJOIN expander, which produces the WITH-CTE structure as standard AST, with the full-row passthrough and the output de-canonicalization of
disjoin_startanddisjoin_endexpressed as AST, dissolving the emit-time string special-case left by epic #114. Make the canonicalization output capability-driven: an explicit portable projection for targets withoutsupports_star_replacesuch as DataFusion, andSELECT * REPLACEfor targets that support it such as DuckDB. FlipGIQL_EXPANDonGIQLDisjoinand deletegiqldisjoin_sql.Motivation
DISJOIN is the largest operator and the one that closes the star-
REPLACEportability gap for non-canonical encodings documented in #122, making non-canonical data work on engines that lackREPLACE.Expected Outcome
DISJOIN transpiles through the registry; non-canonical encodings produce portable SQL on DataFusion and
REPLACESQL on DuckDB, both with identical results under the coordinate-space and usage-pattern result oracles run on both engines;giqldisjoin_sqlis removed.