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

129 lines
3.9 KiB
Markdown

<!-- file: deltas/0.3.3/pre.009-fix.005.md -->
<!-- version: 1 -->
# 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
```