129 lines
3.9 KiB
Markdown
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
|
|
```
|