v0.3.3-pre.009-fix.005
This commit is contained in:
128
deltas/0.3.3/pre.009-fix.005.md
Normal file
128
deltas/0.3.3/pre.009-fix.005.md
Normal file
@@ -0,0 +1,128 @@
|
||||
<!-- 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
|
||||
```
|
||||
Reference in New Issue
Block a user