Files
khadhroony-solana-project/deltas/0.3.3/pre.009-fix.005.md

3.9 KiB

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 :

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 :

constraints/007_ck_ksp_raw_transactions_block_time.sql

La ressource crée :

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 :

'253402300799999'::bigint

2. Version

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 :

'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 :

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

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

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 :

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