SlimeInformix — Informix 移行の「隠れ方言」を、実機で証明する
Informix(I4GL / ESQL/C / ESQL/COBOL)資産を PostgreSQL / Java へ移行するとき、一番こわいのは 「動いているように見えて、答えが静かに変わる」方言差です。私たちは実機 Informix をオラクルに、 移行前後を bit-exact で突き合わせ、振る舞いが変わっていないことを機械で証明します。
sql_pre / sql_emit)を開発中です。
いま証明できているのは ―― 実機 Informix 15.0.1 Developer Edition で確定した「隠れ方言トラップ」のカタログと、
real-iron オラクル kit(ocesql が DB2 系 EXEC SQL を検証したのと同型の Informix 版)。「Informix 対応済」とは書きません。
Informix の古いシステムを PostgreSQL/Java へ引っ越すとき、「動いてるのに答えが静かに変わる」方言差が一番こわい。実機 Informix を"お手本"に、移行前後が同じ答えになるか機械で検証します(変換器は開発中)。
Informix と PostgreSQL は整数の割り算(100/8 が 12.5 か 12 か)や小数→整数の丸めが静かに違います。実機 Informix 15.0.1 ⇄ PostgreSQL 16 を 51 プローブで突合し、隠れ方言トラップ 12 件を確定。「95% 自動化」が見落とす箇所を実測で押さえました。
Informix の int/int=浮動小数・CAST=切捨て・ORDER BY の NULL 位置・桁あふれの黙殺切捨て等を実機オラクルで N/N 突合し faithful 変換が一致することを証跡化。当初の「空文字列=NULL」想定は実機で覆り撤回(文書でなく実測)。変換器は開発中。
real-iron(実 Informix Developer Edition)を独立オラクルに据え、同一 SQL の値/順序が PostgreSQL と乖離する箇所だけ採録。各トラップに bit-exact 写像(a/b→a::numeric/b、CAST→trunc()::int、ORDER BY→NULLS FIRST)。整数 wrapping を Rust wrapping へ写すのと同型。
📋 「このレベルで AI に質問」= 選んだ解像度に合った指示つきで、このページの解説をコピーします。お手元の AI(Claude · GPT · Gemini · Grok 等)に貼れば、その目線でさらに深掘りできます。
いま証明できていること(正直に)
- 隠れ方言の実機確定実 Informix 15.0.1 Developer Edition ⇄ 実 PostgreSQL 16 に同じ SQL を 51 プローブ流し、値/順序が実際に食い違った 12 件だけを採録。文書でなく実測です。
- real-iron オラクル稼働中の Informix を独立参照実装(オラクル)とし、移行後の出力と byte / 結果を N/N 突合。Docker 1 コマンドで起動でき、第三者が手元で再現できます。
- 無条件 silent トラップ 4 件下表のうち ★★★ の 4 件は条件なしで静かに値が変わる=競合の「95% 自動化」が最も見落とす核。
なぜ「95% 自動化」では危ないか ― 実機で確定した隠れ方言
同じ SQL が Informix と PostgreSQL で違う答えを出す箇所。naive な「素通し」変換は、ここでエラーも出さずに静かに壊れます。 これは SlimeJava の「整数トラップ表」(Java の wrapping を素朴に写すと壊れる)の SQL 層版です。
| 危険度 | 方言トラップ | Informix | PostgreSQL | 帰結 |
|---|---|---|---|---|
| ★★★ | 整数除算 total/cnt(100/8) | 12.5(浮動小数) | 12(切捨て) | 平均・按分・歩合が静かに切捨て(金額欠損) |
| ★★★ | 小数→整数 CAST(2.7 AS INT) | 2(切捨て) | 3(四捨五入) | 整数項目への代入が静かに違う |
| ★★★ | NULL のソート順 ORDER BY x | NULLs 先頭 | NULLs 末尾 | top-N・ページング・「先頭行」が変わる |
| ★★★ | 桁あふれ INSERT char(5)←8文字 | 黙って 'ABCDE' | ERROR | サイレントなデータ欠損 / 移行でアプリ停止 |
| ★★ | MOD(10.5,3) / SUBSTR 負数 / SMALLINT 溢れ / 日付書式 / 末尾空白 | いずれも実機で食い違い確認(計 6 件、条件・型依存を正直に注記) | ||
'' は空文字列のまま(NULL 化しない)と判明し撤回しました ―― これが「文書でなく実測」です。私たちのやり方 ― 実機オラクルで「振る舞い不変」を証明
各トラップは「変換器が Informix の意味論を写すべき箇所」です。faithful(忠実)変換は実機 Informix と一致し、その証跡を出します。
| トラップ | 変換器が写すべき形(例) |
|---|---|
| 整数除算 | a/b → a::numeric/b(浮動小数へ昇格) |
| 小数→整数 | CAST(x AS INT) → trunc(x)::int(四捨五入でなく切捨て) |
| NULL 順 | ORDER BY x → ORDER BY x NULLS FIRST |
| 桁あふれ | substr(v,1,n) で Informix の黙殺切捨てを可視化(=データ欠損を証跡化) |
これは整数の wrapping を Rust の wrapping へ写すのと同型の発想です。成果物は 「振る舞い不変の証明書」=全トラップを実機オラクルと N/N 突合した、第三者が手元で再現できる証跡。
まだ確認していないこと(誇張しない)
- 変換器Informix 方言の
sql_pre/sql_emit(A/D/E/I の自動写像)は開発中。= 「Informix 変換 対応済」とは言いません。 - 完全 ESQL オラクルInformix 同梱の ESQL/C・ESQL/COBOL プリコンパイラで原 ESQL を実機実行し、ホスト変数 + indicator まで取る real-iron オラクルは次段階。現状は SQL/格納層で確定。
- 大規模 corpus実公開 Informix コーパス全数での等価検証は未。現状は方言トラップの確定 + PoC 規模。
SlimeNENC ファミリーでの位置づけ
SlimeInformix は SlimeCOBOL の埋め込み SQL 機能 SlimeCOBOL-ESQL の Informix トラックです。 レガシー側は COBOL / JCL / RPG、DB 側は DB2(独立参照 ocesql で検証済)に加え、Informix を実機オラクルで詰めています。 Informix は z/OS メインフレームではなく Unix ミッドレンジの enterprise legacy ―― メインフレーム track とは別系統の兄弟トラックとして正直に位置づけます。
お問い合わせ / PoC 評価の相談 SlimeCOBOL-ESQL リソース SlimeNENC ファミリー 他の製品
数値はすべて実 Informix 15.0.1 Developer Edition と実 PostgreSQL 16 の実走値(2026-06)。文書から組んだ主張はありません。
