# Delta `0.3.3-pre.009-fix.005` — canonicalisation des littéraux numériques/intégraux PostgreSQL ## 1. Base et diagnostic réel Base opérateur : ```text 0.3.3-pre.9.fix.4 ``` Le gate standard `pre.009-fix.004` fourni le 2026-08-30 est entièrement propre. Le live PostgreSQL 17 confirme que la correction du CHECK `slot` est effective puis avance jusqu'à la ressource suivante : ```text constraints/007_ck_ksp_raw_transactions_block_time.sql ``` La ressource crée : ```sql CHECK ( block_time_unix_millis IS NULL OR block_time_unix_millis >= 0 AND block_time_unix_millis <= 253402300799999 ) ``` `block_time_unix_millis` est `BIGINT`. `pg_get_constraintdef` reconstruit une expression depuis la représentation catalogue au lieu de restituer le texte SQL original ; une constante entière typée peut donc apparaître avec un cast explicite. La normalisation de `fix.004` savait retirer les quotes uniquement pour `::numeric` et pouvait encore considérer comme différente une forme telle que : ```text '253402300799999'::bigint ``` ## 2. Version ```text workspace.package.version = 0.3.3-pre.9.fix.5 ``` ## 3. Correction d'introspection `schema.rs` généralise la canonicalisation ciblée des littéraux entiers quotés. Une chaîne n'est déquotée que si : - elle est constituée d'un signe ASCII optionnel suivi uniquement de chiffres ASCII ; - elle est immédiatement suivie d'un cast numérique/intégral PostgreSQL retenu ; - le cast appartient à `numeric`, `bigint`, `integer`, `smallint`, `int8`, `int4` ou `int2`. Les casts équivalents non quotés sont également supprimés par la normalisation générale. Cette règle reste volontairement distincte des littéraux métier/textuels : ```text 'full'::text 'archived'::text 'purged'::text ``` conservent leurs quotes dans la forme normalisée. ## 4. Canaris Le test d'équivalence catalogue couvre désormais : - le CHECK `slot` avec `'18446744073709551615'::numeric` ; - le CHECK `block_time` avec `'0'::bigint` et `'253402300799999'::bigint` ; - l'alias intégral `::int8` sur la borne `format_version` ; - la préservation du littéral texte `'full'::text`. Le but est de normaliser des représentations typées équivalentes, jamais de rendre un CHECK divergent compatible. ## 5. Pourquoi V001 reste inchangée Comme pour `slot`, PostgreSQL applique la contrainte avant que KSP ne la rejette lors de la relecture post-apply. Le défaut reste donc dans l'équivalence de catalogue. Modifier le SQL V001 créerait une migration logique différente sans corriger la cause. Checksums attendus inchangés : ```text V000 d29068b8c13b9dc0cc9ef6aaadd0fa12d41e0fe4c56541a1118c4bfc846a1450 V001 31488cda2f08f3f46c4cdbdbb6c18c243662fada02eac4487040c8735d72cc51 ``` ## 6. Scope Aucun changement de : - ressource SQL V000/V001 ; - ordre/nombre des 40 ressources V001 ; - runtime RawTransaction ; - pagination/cursor/rétention ; - Store API/façade ; - Config ; - scope `RawAccountState`. ## 7. Fichiers modifiés ```text Cargo.toml crates/ksp-store-postgres-lib/src/schema.rs crates/ksp-store-postgres-lib/unit_tests/schema.rs docs/validation/020-V0_3_3_STORE_POSTGRES_RAW_TRANSACTION.md deltas/0.3.3/pre.009-fix.005.md ``` Aucune suppression. ## 8. Gate opérateur attendu ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.3 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-store-api cargo test -p ksp-store-lib cargo test -p ksp-store-postgres-lib cargo test -p ksp-config-lib cargo check -p ksp-store-lib --no-default-features ``` Puis : ```bash read -rsp "Dedicated PostgreSQL URI: " KSP_PG_TEST_URI; echo printf '%s\n' "$KSP_PG_TEST_URI" | cargo test -p ksp-store-postgres-lib --test postgres_raw_transaction_live -- --ignored --nocapture --test-threads=1 unset KSP_PG_TEST_URI ```