Resolving Ignition 8.3 Report Show Builder NullPointerException

Daniel Price8 min read
HMI / SCADAOther ManufacturerTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

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?

  1. Record the current build from the gateway status page or Designer Help > About: it should read v8.3.0-beta2 (b2025080409).
  2. Take a full gateway backup from the gateway web interface and copy it off the host.
  3. Download the 8.3.0 final (or later 8.3.x) installer from Inductive Automation and read its release notes for IGN-14133 or a report query builder column-size fix.
  4. Stop the gateway service, run the installer as an upgrade over the existing installation, and start the service.
  5. Open the gateway web interface and confirm the MySQL database connection status returns to Valid.
  6. 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:

  1. Open the report, go to the Data tab, and select the SQL query data source.
  2. Leave the builder closed and type the SELECT directly into the query editor, naming columns explicitly rather than using SELECT *.
  3. Bind report parameters into the query where filtering is needed.
  4. Open the Preview tab and confirm the data key populates with the expected rows.

For the view approach, when the builder itself is required:

  1. Create a dedicated MySQL schema for reporting views.
  2. 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) or DECIMAL(p,s) chosen to fit the stored data.
  3. Grant SELECT on the view to the MySQL user the gateway uses.
  4. Add a new Ignition database connection pointing at the reporting schema.
  5. 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?

  1. In the gateway, clear or note the current log position, then in the Designer open the report's Data tab.
  2. Select the original query data source pointing at the original MySQL connection, not the reporting-view workaround.
  3. 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.
  4. Drag two columns into the builder, generate the query, and run the report Preview; rows must return.
  5. Check the gateway logs for the time window of the test. There must be no NullPointerException from DatasourceRpcImpl.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.

Back to blog