[Bug] findColumn throws NullPointerException instead of SQLException for an unknown column name
- Lingua principale
- Java
- Stelle
- 6.4k
- Fork
- 1.2k
- Merge medio
- 1g 23h
- PR unite (30g)
- 115
Descrizione
### Search before asking
- [x] I searched in the [issues](https://github.com/apache/iotdb/issues) and found nothing similar.
### Version
`master` (2.0.x). The affected code is also present in released 2.0.x versions.
### Describe the bug and provide the minimal reproduce step
`IoTDBRpcDataSet.findColumn(String)` returns `columnOrdinalMap.get(columnName)` directly. When the column name is not present, `Map.get` returns `null`, which auto-unboxes to `int` and throws a `NullPointerException`. The JDBC contract (`ResultSet.findColumn`) requires a `SQLException` when the column is not found, and the sibling `findColumnNameByIndex` already guards its input and throws — the guard was simply omitted for `findColumn`.
This surfaces at the JDBC boundary (`IoTDBJDBCResultSet.findColumn`) and through `SessionDataSet.DataIterator.findColumn`, both of which delegate to the method above. The same missing guard also exists in `IoTDBJDBCDataSet.findColumn`.
Minimal reproduce step:
1. Execute any query over JDBC and obtain the `ResultSet`.
2. Call `resultSet.findColumn("a_column_name_that_is_not_in_the_result")`.
3. A raw `NullPointerException` is thrown instead of a `SQLException`.
### What did you expect to see?
`findColumn` throws a `SQLException` (at the JDBC boundary) that names the missing column, per the `ResultSet.findColumn` contract.
### What did you see instead?
A `NullPointerException`, from unboxing the `null` returned by the column-ordinal map lookup.
### Anything else?
The fix mirrors the existing `findColumnNameByIndex` guard: throw a checked `StatementExecutionException` at the rpc layer (reusing the existing `UNKNOWN_COLUMN_NAME` message), converted to `SQLException` at the JDBC boundary. I'd like to work on this and will open a PR (which also fixes the identical, currently-unused-but-public `IoTDBJDBCDataSet.findColumn`).
### Are you willing to submit a PR?
- [x] I'm willing to submit a PR!
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Inizia da IoTDBRpcDataSet.findColumn e confrontalo con il controllo guard esistente di findColumnNameByIndex, quindi segui il confine JDBC attraverso IoTDBJDBCResultSet.findColumn e SessionDataSet.DataIterator.findColumn. Controlla anche IoTDBJDBCDataSet.findColumn; il lavoro è completo quando una colonna sconosciuta produce una SQLException che indica il nome della colonna mancante invece di una NullPointerException.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- java
- Ambito
- database
- Tipo di issue
- Bug
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Stato di attività
- Tranquilla
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 78/100