pgrecon 0.4.0
Hierarchical queries come home, and Oracle's empty-string rules hold in two more places.
CONNECT BY views convert to WITH RECURSIVE: one table, one PRIOR equality, plain-column projections, LEVEL, and SYS_CONNECT_BY_PATH with a literal separator. START WITH filters the base branch, a WHERE applies after the hierarchy exactly as Oracle evaluates it, and a hidden key column carries the parent join so the projection list does not have to. NOCYCLE, ORDER SIBLINGS BY, joins, and PRIOR over expressions refuse by name. The conversion was verified row-for-row against a live Oracle database running the original view - same rows, same LEVEL values, same paths, byte for byte.
DECODE translates with Oracle's null rules intact. In Oracle an empty-string argument is NULL, so DECODE(x, '', a, b) must test x IS NULL - a comparison against '' could never match. Literal searches keep plain equality, and a column search carries the both-NULL match DECODE gives it. Views over JSON_TABLE now refuse by name - PostgreSQL adds JSON_TABLE in version 17 with different clause syntax, and the residue line says so instead of surfacing a parser error.
Materialized views stop converting silently: the dictionary hands them over as container tables, so the table still converts and a residue line names the loss - the defining query, the refresh schedule, and the absence of query rewrite in PostgreSQL.
As always: across the nine-schema comparison lab the converter emitted zero statements PostgreSQL rejected; everything it cannot prove is a named line in the residue report.