Skip to content

feat: validate SQL during dry-run#55

Merged
Gabrymi93 merged 4 commits intomainfrom
feat/sql-dry-run-validation
Mar 19, 2026
Merged

feat: validate SQL during dry-run#55
Gabrymi93 merged 4 commits intomainfrom
feat/sql-dry-run-validation

Conversation

@Gabrymi93
Copy link
Copy Markdown
Member

Cosa cambia

  • aggiunge una validazione SQL in-memory durante --dry-run per clean e mart
  • fallisce prima del run reale se trova errori di sintassi o binding nei casi comuni
  • stampa sql_validation: OK quando il check passa

Verifica

  • test mirati su ests/test_run_dry_run.py e ests/test_cli_path_contract.py
  • project-example in --dry-run
  • check reale su due config DI:
    • candidates/mit-opere-incompiute-2020/dataset.yml
    • candidates/ispra-consumo-suolo/sources/a_consumo_suolo/dataset.yml

Note

  • il check oggi copre clean e mart
  • cross_year resta fuori e richiede una validazione dedicata

Closes #49

@Gabrymi93 Gabrymi93 requested review from matteocavo March 18, 2026 12:38
Copy link
Copy Markdown
Contributor

@matteocavo matteocavo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ho controllato la PR e la direzione mi sembra giusta: i test mirati passano e anche i due --dry-run reali citati nel body reggono.

C'è però un caso che oggi mi sembra ancora bloccante prima del merge.

Nel nuovo sql_dry_run, il placeholder di raw_input viene costruito usando:

  • clean.read.columns, se presenti;
  • gli identifier tra doppi apici trovati nel SQL.

Questo però genera un falso positivo su clean.sql validi che usano colonne non quotate senza dichiararle in clean.read.columns.

Repro minimo che ho provato:

  • clean.sql: select x as value from raw_input
  • mart.sql: select * from clean_input

Con la PR attuale, run all --dry-run fallisce con un binder error su x, anche se quel clean.sql è valido in esecuzione reale.

Quindi, per come la vedo io, la PR è quasi pronta ma non ancora da mergiare così com'è:
serve almeno coprire questo caso o restringere meglio il contratto del dry-run per non introdurre falsi positivi.

@Gabrymi93
Copy link
Copy Markdown
Member Author

Il finding di matteocavo era corretto e il caso repro e' ora coperto.

Il commit 140418a aggiunge un fallback incrementale in _build_clean_preview: se DuckDB segnala un binder error con Referenced column "x" not found in FROM clause, il nome viene estratto via regex e aggiunto al placeholder raw_input, poi il dry-run riprova. Il loop si ripete fino a 25 tentativi o fino a quando DuckDB non solleva un errore diverso (sintassi, binding su colonne non di raw, ecc.).

Il repro di matteocavo:

  • clean.sql: select x as value from raw_input
  • mart.sql: select * from clean_input
  • esito prima: binder error su x
  • esito dopo: DRY_RUN_OK, sql_validation: OK

Il nuovo test test_run_dry_run_accepts_unquoted_raw_columns_without_read_columns copre esattamente questo caso. I 5 test esistenti passano invariati.

Una nota sui limiti residui: il fallback e' deliberatamente approssimativo — se il clean SQL ha un errore reale che produce un binder error su una colonna non di raw_input, il retry potrebbe in teoria aggiungerla al placeholder e far passare il dry-run quando non dovrebbe. E' un falso negativo possibile ma raro in pratica, e gia' documentato nel commento del codice. Il dry-run resta una rete di sicurezza per gli errori comuni, non una validazione completa.

Per il resto la PR mi sembra pronta.

Copy link
Copy Markdown
Contributor

@matteocavo matteocavo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok

@Gabrymi93 Gabrymi93 merged commit 40e3d73 into main Mar 19, 2026
5 checks passed
@Gabrymi93 Gabrymi93 deleted the feat/sql-dry-run-validation branch March 19, 2026 11:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: SQL dry-run validation via DuckDB EXPLAIN

2 participants