On Ignition v8.3.0-beta2 (b2025080409) running Java Azul Systems, Inc. 17.0.15, clicking Show Builder on a Report SQL query data source against a MySQL table throws:
java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because "columnSize" is null
at com.inductiveautomation.ignition.gateway.servlets.gateway.functions.DatasourceRpcImpl.listColumns(DatasourceRpcImpl.java:260)
This is a gateway-side bug, tracked as IGN-14133. The gateway reads column metadata from the JDBC driver, receives a null column size for at least one column, and unboxes it without a null check. Inductive Automation reproduced the fault and scheduled the fix for the 8.3.0 final release. Nothing is wrong with the database connection, the network, or the report itself.
Where does the Show Builder request fail between Designer and MySQL?
Trace the request hop by hop from the stack trace. The Designer never talks to MySQL directly; it asks the gateway over an HTTP RPC, and the gateway queries the database through its JDBC connection pool.
| Hop | Component (from stack trace) | Role | Status in this failure |
|---|---|---|---|
| 1 | Designer, Report Data tab | User clicks Show Builder; Designer issues an RPC for table/column metadata | Sent |
| 2 | Jetty org.eclipse.jetty.server.Server / HttpConnection
|
Receives HTTP request on the gateway web port | Passed |
| 3 | com.inductiveautomation.catapult.filters.GatewayFilter |
Gateway request filtering | Passed |
| 4 |
RouteGroupCollectionServlet → Route.service → RpcRoutes.handle
|
Dispatches the RPC route | Passed |
| 5 | RpcDelegate$DelegateRpcHandler.handle |
Invokes the RPC implementation by reflection | Passed |
| 6 |
DatasourceRpcImpl.listColumns line 260 |
Calls JDBC column metadata, converts each column's size to a primitive int
|
Fails here |
| 7 | MySQL JDBC driver → MySQL server | Returns the metadata result set | Completed successfully; the null came back as valid data |
The request reached the database and got an answer. The exception is thrown on the way back, inside gateway code, so the Designer receives an error instead of a column list. Connection-pool status, credentials, firewall rules, and MySQL grants are all irrelevant to this fault.
Why does a null COLUMN_SIZE crash listColumns?
The builder populates its column tree from the JDBC DatabaseMetaData.getColumns() result set. One of its fields is COLUMN_SIZE, and the JDBC specification defines it as follows:
- Numeric data: maximum precision.
- Character data: length in characters.
- Datetime types: length in characters of the string representation, assuming maximum fractional-seconds precision.
- Binary data: length in bytes.
-
ROWID: length in bytes. - Null is returned for data types where the column size is not applicable.
Null is therefore a legal, specified value. The gateway code at DatasourceRpcImpl.java:260 reads the value into a java.lang.Integer named columnSize and then calls intValue() on it. Java auto-unboxing of a null Integer raises NullPointerException, and on Java 17 the helpful-NPE message names the exact variable, which is why the error text says "columnSize" is null. One column with a non-applicable size type is enough to abort the entire column listing.
Which symptoms point to this bug instead of a connection fault?
| Observation | Points to | Why |
|---|---|---|
Error text contains columnSize is null and trace tops out at DatasourceRpcImpl.listColumns
|
IGN-14133 metadata bug | Failure is in gateway code after metadata returned |
| Hand-typed SQL in the same query source runs and previews correctly | IGN-14133 metadata bug | Query execution does not use the column-size path |
| Deleting and recreating the query data source gives the same error | IGN-14133 metadata bug | The metadata comes from the table, not the report object |
| Gateway shows the MySQL connection as Valid | IGN-14133 metadata bug | Connectivity is intact |
| Trace contains a SQL or communications exception (timeout, access denied, unknown database) | Connection or permission fault | Different failure; troubleshoot the database connection instead |
| Builder opens against a different schema or database but not this one | A column type in this schema returns null size | Isolate the offending column (next section) |
Always open the Details tab of the error dialog and copy the full stack trace. The one-line summary alone does not show which gateway class threw; the trace does.
Which MySQL columns return a null column size?
The driver computes COLUMN_SIZE itself, so the definitive answer comes from JDBC metadata. For a fast screen, query and look for columns with no length, no numeric precision, and no datetime precision:
Rows where all three size fields are NULL are the candidates. Run the query without the filter as well: the builder browses the schema bound to the Ignition database connection, so a candidate column in any table of that schema matters. Treat the screen as a shortlist, then confirm by exposing the table without those columns (view workaround below) and reopening the builder.
Which workaround fits: upgrade, hand-written SQL, a view, or a rebuilt source?
| Approach | Fixes root cause | Schema changes | Effort | Keeps builder usable | Notes |
|---|---|---|---|---|---|
| Upgrade gateway to 8.3.0 final or later | Yes | None | Gateway maintenance window | Yes | Fix was scheduled for 8.3.0 final; confirm in release notes |
| Type SQL directly into the query data source | No, bypasses the builder | None | Minimal | No | Query execution path is unaffected |
| Named Query as the report data source | No, bypasses the builder | None | Low | No | Query authored and tested in the Named Query editor |
| View in a separate schema with CAST columns, separate Ignition connection | No, hides the offending type | New schema, view, grants, connection | Moderate | Yes, against the view | A view in the same schema does not help: the original table is still browsed |
| Delete and recreate the query data source | No | None | Minimal | No | Same metadata, same failure |
| Alter the table's column type | No, removes the trigger | Production DDL | High risk | Yes | Changes data semantics for other consumers; not justified for a gateway bug |
Recommendation: move the gateway off 8.3.0-beta2 to the 8.3.0 final release or later. A beta build should not stay in service once a final release is available, and the upgrade removes the fault without touching the database. Until the upgrade is scheduled, write the SQL by hand or use a Named Query; both avoid the metadata call entirely. Reserve the view approach for cases where someone needs the drag-and-drop builder before the upgrade.
How do I move the gateway off 8.3.0-beta2?
- Record the current build from the gateway status page or Designer Help > About: it should read
v8.3.0-beta2 (b2025080409). - Take a full gateway backup from the gateway web interface and copy it off the host.
- Download the 8.3.0 final (or later 8.3.x) installer from Inductive Automation and read its release notes for
IGN-14133or a report query builder column-size fix. - Stop the gateway service, run the installer as an upgrade over the existing installation, and start the service.
- Open the gateway web interface and confirm the MySQL database connection status returns to Valid.
- Relaunch the Designer through the Designer Launcher so the client matches the gateway version; a stale beta Designer against a final gateway adds a second variable to the test.
How do I keep reports building until the upgrade lands?
For hand-written SQL:
- Open the report, go to the Data tab, and select the SQL query data source.
- Leave the builder closed and type the
SELECTdirectly into the query editor, naming columns explicitly rather than usingSELECT *. - Bind report parameters into the query where filtering is needed.
- Open the Preview tab and confirm the data key populates with the expected rows.
For the view approach, when the builder itself is required:
- Create a dedicated MySQL schema for reporting views.
- Create a view there that selects the needed columns from the source table, either omitting the candidate columns found earlier or casting them to a sized type such as
CHAR(n)orDECIMAL(p,s)chosen to fit the stored data. - Grant
SELECTon the view to the MySQL user the gateway uses. - Add a new Ignition database connection pointing at the reporting schema.
- Select that connection in the report's query data source and open Show Builder. If the builder now loads, the omitted or cast column was the trigger.
How do I confirm the builder loads the column list?
- In the gateway, clear or note the current log position, then in the Designer open the report's Data tab.
- Select the original query data source pointing at the original MySQL connection, not the reporting-view workaround.
- Click Show Builder. The builder must open with the table tree populated and every column of the table listed, including the column types that failed before.
- Drag two columns into the builder, generate the query, and run the report Preview; rows must return.
- Check the gateway logs for the time window of the test. There must be no
NullPointerExceptionfromDatasourceRpcImpl.listColumns. If the builder opens but the log still shows that entry, the gateway did not take the upgrade: recheck the build number reported in Help > About against the installer you ran.
FAQ
What happens if I delete the query data source and create a new one?
The error returns. The null column size comes from the JDBC metadata for the table, not from the report object, so a fresh data source requests the same metadata and hits the same unchecked unboxing in DatasourceRpcImpl.listColumns.
What happens if I type the SQL query manually instead of using Show Builder?
The query runs normally. Query execution does not go through the column-size listing that fails, so hand-written SQL or a Named Query data source works on 8.3.0-beta2 while the builder remains broken.
What happens if I create a view in the same MySQL schema to hide the column?
The builder still browses the original table in that schema, so the error can persist. Put the view in a separate schema and point a separate Ignition database connection at it.
Why is columnSize null for a MySQL column in Ignition's report builder?
The JDBC specification returns null COLUMN_SIZE for data types where a size is not applicable. The 8.3.0-beta2 gateway does not guard against that null; the fix was scheduled for the 8.3.0 final release, so upgrade and confirm Show Builder lists every column with no listColumns exception in the gateway log.