diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcRuntimeException.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcRuntimeException.java index 38e5171be40f..3a0482399fc7 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcRuntimeException.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcRuntimeException.java @@ -45,4 +45,8 @@ public BigQueryJdbcRuntimeException(Throwable ex) { public BigQueryJdbcRuntimeException(String message, InterruptedException ex) { super(message, ex); } + + public BigQueryJdbcRuntimeException(String message, Throwable ex) { + super(message, ex); + } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcSqlSyntaxErrorException.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcSqlSyntaxErrorException.java index 99edcd0c543c..0c2167293151 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcSqlSyntaxErrorException.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/exception/BigQueryJdbcSqlSyntaxErrorException.java @@ -33,4 +33,8 @@ public class BigQueryJdbcSqlSyntaxErrorException extends SQLSyntaxErrorException public BigQueryJdbcSqlSyntaxErrorException(BigQueryException ex) { super(ex.getMessage(), "Incorrect SQL syntax."); } + + public BigQueryJdbcSqlSyntaxErrorException(String message, BigQueryException ex) { + super(message, ex); + } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryArrowResultSet.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryArrowResultSet.java index 1d7d89e3f1f1..9fadb090ae6e 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryArrowResultSet.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryArrowResultSet.java @@ -108,7 +108,10 @@ private BigQueryArrowResultSet( try { this.arrowDeserializer = new ArrowDeserializer(arrowSchema); } catch (IOException ex) { - throw new BigQueryJdbcException(ex); + BigQueryJdbcException e = + new BigQueryJdbcException("IOException during ArrowDeserializer creation", ex); + LOG.severe(e, e.getMessage()); + throw e; } } } @@ -215,8 +218,11 @@ public boolean next() throws SQLException { checkClosed(); if (this.isNested) { if (this.currentNestedBatch == null || this.currentNestedBatch.getNestedRecords() == null) { - throw new IllegalStateException( - "currentNestedBatch/JsonStringArrayList can not be null working with the nested record"); + IllegalStateException ex = + new IllegalStateException( + "currentNestedBatch/JsonStringArrayList can not be null working with the nested record"); + LOG.severe(ex, ex.getMessage()); + throw ex; } if (this.nestedRowIndex < (this.toIndexExclusive - 1)) { /* Check if there's a next record in the array which can be read */ @@ -238,7 +244,10 @@ public boolean next() throws SQLException { // Advance the cursor. Potentially blocking operation. BigQueryArrowBatchWrapper batchWrapper = this.buffer.take(); if (batchWrapper.getException() != null) { - throw new BigQueryJdbcRuntimeException(batchWrapper.getException()); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException(batchWrapper.getException()); + LOG.severe(ex, ex.getMessage()); + throw ex; } if (batchWrapper.isLast()) { /* Marks the end of the records */ @@ -267,9 +276,12 @@ else if (this.currentBatchRowIndex < this.vectorSchemaRoot.getRowCount()) { return true; } } catch (InterruptedException | SQLException ex) { - throw new BigQueryJdbcException( - "Error occurred while advancing the cursor. This could happen when connection is closed while the next method is being called.", - ex); + BigQueryJdbcException e = + new BigQueryJdbcException( + "Error occurred while advancing the cursor. This could happen when connection is closed while the next method is being called.", + ex); + LOG.severe(e, e.getMessage()); + throw e; } } return false; @@ -283,12 +295,16 @@ private Object getObjectInternal(int columnIndex) throws SQLException { // BigQuery doesn't support multidimensional arrays, so // just the default row num column (1) and the actual column (2) is supposed to be read if (!(columnIndex == 1 || columnIndex == 2)) { - - throw new IllegalArgumentException( - "Column index is required to be 1 or 2 for nested arrays"); + IllegalArgumentException ex = + new IllegalArgumentException("Column index is required to be 1 or 2 for nested arrays"); + LOG.severe(ex, ex.getMessage()); + throw ex; } if (this.currentNestedBatch.getNestedRecords() == null) { - throw new IllegalStateException("JsonStringArrayList cannot be null for nested records."); + IllegalStateException ex = + new IllegalStateException("JsonStringArrayList cannot be null for nested records."); + LOG.severe(ex, ex.getMessage()); + throw ex; } // For Arrays the first column is Index, ref: // https://docs.oracle.com/javase/7/docs/api/java/sql/Array.html#getResultSet() diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryBaseResultSet.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryBaseResultSet.java index 7b37bf0dcecc..14f1801d5c64 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryBaseResultSet.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryBaseResultSet.java @@ -228,7 +228,9 @@ protected int getColumnIndex(String columnLabel) throws SQLException { LOG.finest("++enter++"); checkClosed(); if (columnLabel == null) { - throw new SQLException("Column label cannot be null"); + SQLException ex = new SQLException("Column label cannot be null"); + LOG.severe(ex, ex.getMessage()); + throw ex; } // use schema to get the column index, add 1 for SQL index return this.schemaFieldList.getIndex(columnLabel) + 1; diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java index 4de22e64e94d..8bb475e74197 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryCallableStatement.java @@ -940,7 +940,9 @@ public void registerOutParameter(int paramIndex, int sqlType) throws SQLExceptio BigQueryParameterHandler.BigQueryStatementParameterType.OUT, -1); } catch (Exception e) { - throw new SQLException(e); + SQLException ex = new SQLException(e); + LOG.severe(ex, "Failed to registerOutParameter"); + throw ex; } } @@ -957,7 +959,9 @@ public void registerOutParameter(String paramName, int sqlType) throws SQLExcept BigQueryParameterHandler.BigQueryStatementParameterType.OUT, -1); } catch (Exception e) { - throw new SQLException(e); + SQLException ex = new SQLException(e); + LOG.severe(ex, "Failed to registerOutParameter"); + throw ex; } } @@ -979,7 +983,9 @@ public void registerOutParameter(int paramIndex, int sqlType, int scale) throws BigQueryParameterHandler.BigQueryStatementParameterType.OUT, scale); } catch (Exception e) { - throw new SQLException(e); + SQLException ex = new SQLException(e); + LOG.severe(ex, "Failed to registerOutParameter"); + throw ex; } } @@ -1012,7 +1018,9 @@ public void registerOutParameter(String paramName, int sqlType, int scale) throw BigQueryParameterHandler.BigQueryStatementParameterType.OUT, scale); } catch (Exception e) { - throw new SQLException(e); + SQLException ex = new SQLException(e); + LOG.severe(ex, "Failed to registerOutParameter"); + throw ex; } } @@ -1236,12 +1244,18 @@ public void setObject(String arg0, Object arg1, int arg2) throws SQLException { if (BigQueryJdbcTypeMappings.standardSQLToJavaSqlTypesMapping.containsKey(sqlType)) { int javaSqlType = BigQueryJdbcTypeMappings.standardSQLToJavaSqlTypesMapping.get(sqlType); if (javaSqlType != arg2) { - throw new BigQueryJdbcSqlFeatureNotSupportedException( - String.format("Unsupported sql type:%s ", arg2)); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException( + String.format("Unsupported sql type:%s ", arg2)); + LOG.severe(ex, ex.getMessage()); + throw ex; } } else { - throw new BigQueryJdbcSqlFeatureNotSupportedException( - String.format("parameter sql type not supported: %s", sqlType)); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException( + String.format("parameter sql type not supported: %s", sqlType)); + LOG.severe(ex, ex.getMessage()); + throw ex; } } @@ -1253,12 +1267,18 @@ public void setObject(String arg0, Object arg1, int arg2, int arg3) throws SQLEx if (BigQueryJdbcTypeMappings.standardSQLToJavaSqlTypesMapping.containsKey(sqlType)) { int javaSqlType = BigQueryJdbcTypeMappings.standardSQLToJavaSqlTypesMapping.get(sqlType); if (javaSqlType != arg2) { - throw new BigQueryJdbcSqlFeatureNotSupportedException( - String.format("Unsupported sql type:%s ", arg2)); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException( + String.format("Unsupported sql type:%s ", arg2)); + LOG.severe(ex, ex.getMessage()); + throw ex; } } else { - throw new BigQueryJdbcSqlFeatureNotSupportedException( - String.format("parameter sql type not supported: %s", sqlType)); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException( + String.format("parameter sql type not supported: %s", sqlType)); + LOG.severe(ex, ex.getMessage()); + throw ex; } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 816d0a8547df..faead58ee879 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -191,9 +191,12 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { } else if (parts.length == 1) { this.defaultDataset = DatasetId.of(parts[0]); } else { - throw new IllegalArgumentException( - "DefaultDataset format is invalid. Supported options are datasetId or" - + " projectId.datasetId"); + IllegalArgumentException ex = + new IllegalArgumentException( + "DefaultDataset format is invalid. Supported options are datasetId or" + + " projectId.datasetId"); + LOG.severe(ex, ex.getMessage()); + throw ex; } } this.location = ds.getLocation(); @@ -267,6 +270,7 @@ String getLibraryVersion(Class libraryClass) { version = props.getProperty("version.jdbc"); } } catch (IOException e) { + LOG.warning("Failed to load dependencies.properties"); return DEFAULT_VERSION; } @@ -297,8 +301,10 @@ BigQueryReadClient getBigQueryReadClient() { this.bigQueryReadClient = getBigQueryReadClientConnection(); } } catch (IOException e) { - LOG.severe(e, "Failed to initialize BigQueryReadClient"); - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException("Failed to initialize BigQueryReadClient", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } return this.bigQueryReadClient; } @@ -309,8 +315,10 @@ BigQueryWriteClient getBigQueryWriteClient() { this.bigQueryWriteClient = getBigQueryWriteClientConnection(); } } catch (IOException e) { - LOG.severe(e, "Failed to initialize BigQueryWriteClient"); - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException("Failed to initialize BigQueryWriteClient", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } return this.bigQueryWriteClient; } @@ -357,7 +365,10 @@ public Statement createStatement(int resultSetType, int resultSetConcurrency) checkClosed(); if (resultSetType != ResultSet.TYPE_FORWARD_ONLY || resultSetConcurrency != ResultSet.CONCUR_READ_ONLY) { - throw new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported createStatement feature."); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported createStatement feature."); + LOG.severe(ex, ex.getMessage()); + throw ex; } return createStatement(); } @@ -383,7 +394,10 @@ public Statement createStatement( if (resultSetType != ResultSet.TYPE_FORWARD_ONLY || resultSetConcurrency != ResultSet.CONCUR_READ_ONLY || resultSetHoldability != ResultSet.CLOSE_CURSORS_AT_COMMIT) { - throw new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported createStatement feature"); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported createStatement feature"); + LOG.severe(ex, ex.getMessage()); + throw ex; } return createStatement(); } @@ -400,14 +414,20 @@ public PreparedStatement prepareStatement(String sql) throws SQLException { @Override public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { if (autoGeneratedKeys != Statement.NO_GENERATED_KEYS) { - throw new BigQueryJdbcSqlFeatureNotSupportedException("autoGeneratedKeys is not supported"); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("autoGeneratedKeys is not supported"); + LOG.severe(ex, ex.getMessage()); + throw ex; } return prepareStatement(sql); } @Override public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { - throw new BigQueryJdbcSqlFeatureNotSupportedException("autoGeneratedKeys is not supported"); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("autoGeneratedKeys is not supported"); + LOG.severe(ex, ex.getMessage()); + throw ex; } @Override @@ -417,7 +437,10 @@ public PreparedStatement prepareStatement( if (resultSetType != ResultSet.TYPE_FORWARD_ONLY || resultSetConcurrency != ResultSet.CONCUR_READ_ONLY || resultSetHoldability != ResultSet.CLOSE_CURSORS_AT_COMMIT) { - throw new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported prepareStatement feature"); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported prepareStatement feature"); + LOG.severe(ex, ex.getMessage()); + throw ex; } return prepareStatement(sql); } @@ -428,7 +451,10 @@ public PreparedStatement prepareStatement(String sql, int resultSetType, int res LOG.finest("++enter++"); if (resultSetType != ResultSet.TYPE_FORWARD_ONLY || resultSetConcurrency != ResultSet.CONCUR_READ_ONLY) { - throw new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported prepareStatement feature"); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("Unsupported prepareStatement feature"); + LOG.severe(ex, ex.getMessage()); + throw ex; } return prepareStatement(sql); } @@ -538,8 +564,10 @@ private void beginTransaction() { } this.transactionStarted = true; } catch (InterruptedException ex) { - LOG.severe(ex, "Failed to begin transaction"); - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = + new BigQueryJdbcRuntimeException("Failed to begin transaction", ex); + LOG.severe(e, e.getMessage()); + throw e; } } @@ -646,7 +674,9 @@ Long getListenerPoolSize() { @Override public boolean isValid(int timeout) throws SQLException { if (timeout < 0) { - throw new BigQueryJdbcException("timeout must be >= 0"); + BigQueryJdbcException ex = new BigQueryJdbcException("timeout must be >= 0"); + LOG.severe(ex, ex.getMessage()); + throw ex; } if (!isClosed()) { try (Statement statement = createStatement(); @@ -776,8 +806,9 @@ public void rollback() throws SQLException { beginTransaction(); } } catch (InterruptedException | BigQueryException ex) { - LOG.severe(ex, "Failed to rollback transaction"); - throw new BigQueryJdbcException(ex); + BigQueryJdbcException e = new BigQueryJdbcException("Failed to rollback transaction", ex); + LOG.severe(e, e.getMessage()); + throw e; } } @@ -852,11 +883,15 @@ public void close() throws SQLException { } this.openStatements.clear(); } catch (ConcurrentModificationException ex) { - LOG.severe(ex, "Concurrent modification during close"); - throw new BigQueryJdbcException(ex); + BigQueryJdbcException e = + new BigQueryJdbcException("Concurrent modification during close", ex); + LOG.severe(e, e.getMessage()); + throw e; } catch (InterruptedException e) { - LOG.severe(e, "Interrupted during close"); - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException("Interrupted during close", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } this.isClosed = true; } @@ -868,14 +903,20 @@ public boolean isClosed() { private void checkClosed() { if (isClosed()) { - throw new IllegalStateException("This " + getClass().getName() + " has been closed"); + IllegalStateException ex = + new IllegalStateException("This " + getClass().getName() + " has been closed"); + LOG.severe(ex, ex.getMessage()); + throw ex; } } private void checkIfEnabledSession(String methodName) { if (!this.enableSession) { - throw new IllegalStateException( - String.format("Session needs to be enabled to use %s method.", methodName)); + IllegalStateException ex = + new IllegalStateException( + String.format("Session needs to be enabled to use %s method.", methodName)); + LOG.severe(ex, ex.getMessage()); + throw ex; } } @@ -1060,7 +1101,10 @@ private void commitTransaction() { commitJob.waitFor(); this.transactionStarted = false; } catch (InterruptedException ex) { - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = + new BigQueryJdbcRuntimeException("Interrupted during commitTransaction", ex); + LOG.severe(e, e.getMessage()); + throw e; } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java index 131ef3041eee..0527db5d5330 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDatabaseMetaData.java @@ -1251,9 +1251,11 @@ List listMatchingProcedureIdsFromDatasets( for (Dataset dataset : datasetsToScan) { if (Thread.currentThread().isInterrupted()) { - logger.warning( - "Interrupted during submission of routine listing tasks for catalog: " + catalogParam); - throw new InterruptedException("Interrupted while listing routines"); + InterruptedException ex = + new InterruptedException( + "Interrupted while listing routines for catalog: " + catalogParam); + logger.severe(ex, ex.getMessage()); + throw ex; } final DatasetId currentDatasetId = dataset.getDatasetId(); Callable> listCallable = @@ -1281,10 +1283,12 @@ List listMatchingProcedureIdsFromDatasets( for (Future> listFuture : listRoutineFutures) { if (Thread.currentThread().isInterrupted()) { - logger.warning( - "Interrupted while collecting routine list results for catalog: " + catalogParam); listRoutineFutures.forEach(f -> f.cancel(true)); - throw new InterruptedException("Interrupted while collecting routine lists"); + InterruptedException ex = + new InterruptedException( + "Interrupted while collecting routine lists for catalog: " + catalogParam); + logger.severe(ex, ex.getMessage()); + throw ex; } try { List listedRoutines = listFuture.get(); @@ -1327,8 +1331,10 @@ List fetchFullRoutineDetailsForIds( for (RoutineId procId : procedureIdsToGet) { if (Thread.currentThread().isInterrupted()) { - logger.warning("Interrupted during submission of getRoutine detail tasks."); - throw new InterruptedException("Interrupted while submitting getRoutine tasks"); + InterruptedException ex = + new InterruptedException("Interrupted while submitting getRoutine tasks"); + logger.severe(ex, ex.getMessage()); + throw ex; } final RoutineId currentProcId = procId; Callable getCallable = @@ -1350,9 +1356,11 @@ List fetchFullRoutineDetailsForIds( for (Future getFuture : getRoutineFutures) { if (Thread.currentThread().isInterrupted()) { - logger.warning("Interrupted while collecting getRoutine detail results."); getRoutineFutures.forEach(f -> f.cancel(true)); // Cancel remaining - throw new InterruptedException("Interrupted while collecting Routine details"); + InterruptedException ex = + new InterruptedException("Interrupted while collecting Routine details"); + logger.severe(ex, ex.getMessage()); + throw ex; } try { Routine fullRoutine = getFuture.get(); @@ -1382,8 +1390,10 @@ void submitProcedureArgumentProcessingJobs( for (Routine fullRoutine : fullRoutines) { if (Thread.currentThread().isInterrupted()) { - logger.warning("Interrupted during submission of argument processing tasks."); - throw new InterruptedException("Interrupted while submitting argument processing jobs"); + InterruptedException ex = + new InterruptedException("Interrupted while submitting argument processing jobs"); + logger.severe(ex, ex.getMessage()); + throw ex; } if (fullRoutine != null) { if ("PROCEDURE".equalsIgnoreCase(fullRoutine.getRoutineType())) { diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java index 4d09ac3e0270..d8155f05e468 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryDriver.java @@ -133,8 +133,9 @@ public Connection connect(String url, Properties info) throws SQLException { try { BigQueryJdbcUrlUtility.parseUrl(connectionUri); } catch (BigQueryJdbcRuntimeException e) { - LOG.severe(e, "Failed to parse connection URL"); - throw new BigQueryJdbcException(e.getMessage(), e); + BigQueryJdbcException ex = new BigQueryJdbcException(e.getMessage(), e); + LOG.severe(ex, "Failed to parse connection URL"); + throw ex; } DataSource ds = DataSource.fromUrl(connectionUri); diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java index 2ee4277e7726..5ca09fb16fd9 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtility.java @@ -293,7 +293,9 @@ static GoogleCredentials getCredentials( credentials = getExternalAccountAuthCredentials(authProperties, callerClassName); break; default: - throw new IllegalStateException(OAUTH_TYPE_ERROR_MESSAGE); + IllegalStateException ex = new IllegalStateException(OAUTH_TYPE_ERROR_MESSAGE); + LOG.severe(ex, ex.getMessage()); + throw ex; } return getServiceAccountImpersonatedCredentials( @@ -369,8 +371,10 @@ private static GoogleCredentials getGoogleServiceAccountCredentials( builder = ServiceAccountCredentials.newBuilder().setClientEmail(pvtEmail).setPrivateKey(key); } else { - LOG.severe("No valid Service Account credentials provided."); - throw new BigQueryJdbcRuntimeException("No valid credentials provided."); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException("No valid credentials provided."); + LOG.severe(ex, ex.getMessage()); + throw ex; } if (overrideProperties.containsKey(BigQueryJdbcUrlUtility.OAUTH2_TOKEN_URI_PROPERTY_NAME)) { @@ -383,8 +387,11 @@ private static GoogleCredentials getGoogleServiceAccountCredentials( overrideProperties.get(BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME)); } } catch (URISyntaxException | IOException e) { - LOG.severe("Validation failure for Service Account credentials."); - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException( + "Validation failure for Service Account credentials.", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } LOG.info("GoogleCredentials instantiated. Auth Method: Service Account."); return builder.build(); @@ -459,8 +466,10 @@ private static GoogleCredentials getGoogleUserAccountCredentials( Matcher m = p.matcher(response); if (!m.find()) { - LOG.severe("Could not retrieve the code for user auth"); - throw new BigQueryJdbcRuntimeException("Could not retrieve the code for user auth"); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException("Could not retrieve the code for user auth"); + LOG.severe(ex, ex.getMessage()); + throw ex; } code = m.group(); @@ -469,14 +478,15 @@ private static GoogleCredentials getGoogleUserAccountCredentials( socket.close(); serverSocket.close(); } else { - LOG.severe("User auth only supported in desktop environments"); - throw new BigQueryJdbcRuntimeException("User auth only supported in desktop environments"); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException("User auth only supported in desktop environments"); + LOG.severe(ex, ex.getMessage()); + throw ex; } return getCredentialsFromCode(userAuthorizer, code, callerClassName); } catch (IOException | URISyntaxException ex) { - LOG.severe( - "Failed to establish connection using User Account authentication: %s", ex.getMessage()); + LOG.severe(ex, "Failed to establish connection using User Account authentication"); throw new BigQueryJdbcRuntimeException(ex); } } @@ -516,7 +526,11 @@ static GoogleCredentials getPreGeneratedTokensCredentials( return getPreGeneratedRefreshTokenCredentials( authProperties, overrideProperties, callerClassName); } catch (URISyntaxException ex) { - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = + new BigQueryJdbcRuntimeException( + "URISyntaxException during getPreGeneratedTokensCredentials", ex); + LOG.severe(e, e.getMessage()); + throw e; } } else { return getPreGeneratedAccessTokenCredentials( @@ -571,8 +585,10 @@ private static GoogleCredentials getApplicationDefaultCredentials(String callerC return credentials; } catch (IOException exception) { - // TODO throw exception - throw new BigQueryJdbcRuntimeException("Application default credentials not found."); + BigQueryJdbcRuntimeException e = + new BigQueryJdbcRuntimeException("Application default credentials not found.", exception); + LOG.severe(e, e.getMessage()); + throw e; } } @@ -621,11 +637,17 @@ private static GoogleCredentials getExternalAccountAuthCredentials( return ExternalAccountCredentials.fromStream( new ByteArrayInputStream(jsonObject.toString().getBytes())); } else { - throw new IllegalArgumentException( - "Insufficient info provided for external authentication"); + IllegalArgumentException ex = + new IllegalArgumentException("Insufficient info provided for external authentication"); + LOG.severe(ex, ex.getMessage()); + throw ex; } } catch (IOException e) { - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException( + "IOException during getExternalAccountAuthCredentials", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } } @@ -678,10 +700,12 @@ private static GoogleCredentials getServiceAccountImpersonatedCredentials( try { impersonationLifetimeInt = Integer.parseInt(impersonationLifetime); } catch (NumberFormatException e) { - LOG.severe("Invalid value for ServiceAccountImpersonationTokenLifetime."); - throw new IllegalArgumentException( - "Invalid value for ServiceAccountImpersonationTokenLifetime: must be a positive integer.", - e); + IllegalArgumentException ex = + new IllegalArgumentException( + "Invalid value for ServiceAccountImpersonationTokenLifetime: must be a positive integer.", + e); + LOG.severe(ex, ex.getMessage()); + throw ex; } return ImpersonatedCredentials.create( @@ -708,7 +732,9 @@ static PrivateKey privateKeyFromPkcs8(String privateKeyPkcs8) { Reader reader = new StringReader(privateKeyPkcs8); PemReader.Section section = readFirstSectionAndClose(reader, "PRIVATE KEY"); if (section == null) { - throw new IOException("Invalid PKCS#8 data."); + IOException ex = new IOException("Invalid PKCS#8 data."); + LOG.severe(ex, ex.getMessage()); + throw ex; } byte[] bytes = section.getBase64DecodedBytes(); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); @@ -739,7 +765,9 @@ static AuthType fromValue(int value) { return authType; } } - throw new IllegalStateException(OAUTH_TYPE_ERROR_MESSAGE + ": " + value); + IllegalStateException ex = new IllegalStateException(OAUTH_TYPE_ERROR_MESSAGE + ": " + value); + LOG.severe(ex, ex.getMessage()); + throw ex; } } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java index e80538be3384..b35b4f3b72dc 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java @@ -207,8 +207,9 @@ private static HttpTransportFactory getHttpTransportFactory( .setSSLSocketFactory(sslSocketFactory) .build()); } catch (IOException | GeneralSecurityException e) { - LOG.severe(e, "Failed to configure SSL TrustStore for HTTP transport"); - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = new BigQueryJdbcRuntimeException(e); + LOG.severe(ex, "Failed to configure SSL TrustStore for HTTP transport"); + throw ex; } } addAuthToProxyIfPresent(proxyProperties, httpClientBuilder, callerClassName); @@ -297,8 +298,9 @@ public ProxiedSocketAddress proxyFor(SocketAddress socketAddress) { .sslContext(grpcSslContext); } catch (IOException | GeneralSecurityException e) { - LOG.severe(e, "Failed to configure SSL TrustStore for GRPC channel"); - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = new BigQueryJdbcRuntimeException(e); + LOG.severe(ex, "Failed to configure SSL TrustStore for GRPC channel"); + throw ex; } } return managedChannelBuilder; diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcTypeMappings.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcTypeMappings.java index b95ac0230264..336e3575683e 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcTypeMappings.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcTypeMappings.java @@ -33,6 +33,8 @@ @InternalApi class BigQueryJdbcTypeMappings { + private static final BigQueryJdbcCustomLogger LOG = + new BigQueryJdbcCustomLogger(BigQueryJdbcTypeMappings.class.getName()); static final Map> standardSQLToJavaTypeMapping = ImmutableMap.ofEntries( @@ -135,20 +137,29 @@ static StandardSQLTypeName classToType(Class type) } else if (byte[].class.isAssignableFrom(type)) { return StandardSQLTypeName.BYTES; } - throw new BigQueryJdbcSqlFeatureNotSupportedException( - "Unsupported object type for QueryParameter: " + type); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException( + "Unsupported object type for QueryParameter: " + type); + LOG.severe(ex, ex.getMessage()); + throw ex; } static Class getJavaType(int javaSQLType) throws BigQueryJdbcSqlFeatureNotSupportedException { if (!javaSQLToJavaTypeMapping.containsKey(javaSQLType)) { - throw new BigQueryJdbcSqlFeatureNotSupportedException( - "Unsupported Java type for SQL type: " + javaSQLType); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException( + "Unsupported Java type for SQL type: " + javaSQLType); + LOG.severe(ex, ex.getMessage()); + throw ex; } Class javaType = javaSQLToJavaTypeMapping.get(javaSQLType); if (javaType == null) { // This should never happen unless the map was initialized with null values. - throw new BigQueryJdbcSqlFeatureNotSupportedException( - "Unsupported Java type for SQL type: " + javaSQLType); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException( + "Unsupported Java type for SQL type: " + javaSQLType); + LOG.severe(ex, ex.getMessage()); + throw ex; } return javaType; } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index 98ec15a94ebf..b947403f499a 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -757,16 +757,15 @@ static boolean convertIntToBoolean(String value, String propertyName) { } } catch (NumberFormatException ex) { - LOG.severe( - ex, - "Invalid value for %s. For Boolean connection properties, use 0 for false and 1 for true.", - propertyName); - throw new IllegalArgumentException( - String.format( - "Invalid value for %s. For Boolean connection properties, use 0 for false and 1 for" - + " true.", - propertyName), - ex); + IllegalArgumentException e = + new IllegalArgumentException( + String.format( + "Invalid value for %s. For Boolean connection properties, use 0 for false and 1 for" + + " true.", + propertyName), + ex); + LOG.severe(e, e.getMessage()); + throw e; } if (integerValue == 1) { return true; diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJsonResultSet.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJsonResultSet.java index da2ade028e9f..42b3aab63417 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJsonResultSet.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJsonResultSet.java @@ -137,8 +137,11 @@ public boolean next() throws SQLException { // We are working with the nested record, the cursor would have been // populated. if (this.cursor == null || this.cursor.getArrayFieldValueList() == null) { - throw new IllegalStateException( - "Cursor/ArrayFieldValueList can not be null working with the nested record"); + IllegalStateException ex = + new IllegalStateException( + "Cursor/ArrayFieldValueList can not be null working with the nested record"); + LOG.severe(ex, ex.getMessage()); + throw ex; } // Check if there's a next record in the array which can be read if (this.nestedRowIndex < (this.toIndexExclusive - 1)) { @@ -160,7 +163,10 @@ public boolean next() throws SQLException { // Advance the cursor,Potentially blocking operation this.cursor = this.buffer.take(); if (this.cursor.getException() != null) { - throw new BigQueryJdbcRuntimeException(this.cursor.getException()); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException(this.cursor.getException()); + LOG.severe(ex, ex.getMessage()); + throw ex; } this.rowCnt++; // Check for end of stream @@ -172,10 +178,14 @@ public boolean next() throws SQLException { // Cursor has been advanced return true; - } catch (InterruptedException ex) { - throw new BigQueryJdbcRuntimeException( - "Error occurred while advancing the cursor. This could happen when connection is closed while we call the next method", - ex); + } catch (InterruptedException e) { + + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException( + "Error occurred while advancing the cursor. This could happen when connection is closed while we call the next method", + e); + LOG.severe(ex, ex.getMessage()); + throw ex; } } } @@ -236,12 +246,17 @@ private FieldValue getObjectInternal(int columnIndex) throws SQLException { // BigQuery doesn't support multidimensional arrays, so just the default row // num column (1) and the actual column (2) is supposed to be read if (!validIndexForNestedResultSet) { - throw new IllegalArgumentException( - "Column index is required to be 1 or 2 for the nested arrays"); + IllegalArgumentException ex = + new IllegalArgumentException( + "Column index is required to be 1 or 2 for the nested arrays"); + LOG.severe(ex, ex.getMessage()); + throw ex; } if (this.cursor.getArrayFieldValueList() == null || this.cursor.getArrayFieldValueList().get(this.nestedRowIndex) == null) { - throw new IllegalStateException("ArrayFieldValueList cannot be null"); + IllegalStateException ex = new IllegalStateException("ArrayFieldValueList cannot be null"); + LOG.severe(ex, ex.getMessage()); + throw ex; } // For Arrays the first column is Index, ref: diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java index 06d72ad2b7c5..494c3a6e3eeb 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryParameterHandler.java @@ -68,7 +68,10 @@ QueryJobConfiguration.Builder configureParameters( } catch (NullPointerException e) { LOG.severe(e, "Null parameter mapping encountered."); if (e.getMessage().contains("Null type")) { - throw new BigQueryJdbcException("One or more parameters missing in Prepared statement.", e); + BigQueryJdbcException ex = + new BigQueryJdbcException("One or more parameters missing in Prepared statement.", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } } return jobConfigurationBuilder; diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java index f3f5e2286536..3feaa1950249 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPooledConnection.java @@ -65,7 +65,9 @@ boolean isListenerPooled(ConnectionEventListener l) { public synchronized Connection getConnection() throws SQLException { LOG.finest("++enter++"); if (inUse) { - throw new SQLException("PooledConnection is already in use."); + SQLException ex = new SQLException("PooledConnection is already in use."); + LOG.severe(ex, ex.getMessage()); + throw ex; } inUse = true; // Return a wrapper around the underlying physical connection. @@ -140,14 +142,20 @@ public synchronized void fireConnectionError(SQLException e) { @Override public void addStatementEventListener(StatementEventListener arg0) { - throw new UnsupportedOperationException( - "Method 'addStatementEventListener' is not supported by the BQ Driver"); + UnsupportedOperationException ex = + new UnsupportedOperationException( + "Method 'addStatementEventListener' is not supported by the BQ Driver"); + LOG.severe(ex, ex.getMessage()); + throw ex; } @Override public void removeStatementEventListener(StatementEventListener arg0) { - throw new UnsupportedOperationException( - "Method 'removeStatementEventListener' is not supported by the BQ Driver"); + UnsupportedOperationException ex = + new UnsupportedOperationException( + "Method 'removeStatementEventListener' is not supported by the BQ Driver"); + LOG.severe(ex, ex.getMessage()); + throw ex; } // Inner class: Connection Wrapper around the actual physical Connection diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java index e38a2f809ec0..e368200eccf2 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryPreparedStatement.java @@ -98,7 +98,9 @@ public ResultSet executeQuery() throws SQLException { jobConfiguration = this.parameterHandler.configureParameters(jobConfiguration); runQuery(this.currentQuery, jobConfiguration.build()); } catch (InterruptedException ex) { - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = new BigQueryJdbcRuntimeException(ex); + LOG.severe(e, "Interrupted during executeQuery"); + throw e; } return getCurrentResultSet(); } @@ -113,7 +115,9 @@ public long executeLargeUpdate() throws SQLException { jobConfiguration = this.parameterHandler.configureParameters(jobConfiguration); runQuery(this.currentQuery, jobConfiguration.build()); } catch (InterruptedException ex) { - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = new BigQueryJdbcRuntimeException(ex); + LOG.severe(e, "Interrupted during executeLargeUpdate"); + throw e; } return this.currentUpdateCount; } @@ -134,7 +138,9 @@ public boolean execute() throws SQLException { jobConfiguration = this.parameterHandler.configureParameters(jobConfiguration); runQuery(this.currentQuery, jobConfiguration.build()); } catch (InterruptedException ex) { - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = new BigQueryJdbcRuntimeException(ex); + LOG.severe(e, "Interrupted during execute"); + throw e; } return getCurrentResultSet() != null; } @@ -291,8 +297,9 @@ public int[] executeBatch() throws SQLException { return insertArray; } catch (DescriptorValidationException | IOException | InterruptedException e) { - LOG.severe(e, "Failed to execute batch with Write API"); - throw new BigQueryJdbcRuntimeException(e); + BigQueryJdbcRuntimeException ex = new BigQueryJdbcRuntimeException(e); + LOG.severe(ex, "Failed to execute batch with Write API"); + throw ex; } } else { @@ -320,11 +327,13 @@ public int[] executeBatch() throws SQLException { } return result; } catch (InterruptedException ex) { - LOG.severe(ex, "Interrupted during individual INSERT batch"); - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = new BigQueryJdbcRuntimeException(ex); + LOG.severe(e, "Interrupted during individual INSERT batch"); + throw e; } catch (SQLException e) { - LOG.severe(e, "SQL error during individual INSERT batch"); - throw new BigQueryJdbcException(e); + BigQueryJdbcException ex = new BigQueryJdbcException(e); + LOG.severe(ex, "SQL error during individual INSERT batch"); + throw ex; } } } @@ -377,7 +386,9 @@ private long bulkInsertWithWriteAPI(BigQueryWriteClient bigQueryWriteClient) } } } catch (BigQueryJdbcException e) { - throw new RuntimeException(e); + RuntimeException ex = new RuntimeException(e); + LOG.severe(ex, "BigQueryJdbcException during bulkInsertWithWriteAPI"); + throw ex; } long rowCount = bulkInsertWriter.cleanup(bigQueryWriteClient); diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryResultSetMetadata.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryResultSetMetadata.java index d18c689333a4..774d854cac6e 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryResultSetMetadata.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryResultSetMetadata.java @@ -203,11 +203,17 @@ public String getColumnClassName(int column) { // Unsupported methods: @Override public T unwrap(Class iface) throws SQLException { - throw new BigQueryJdbcSqlFeatureNotSupportedException("unwrap is not implemented"); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("unwrap is not implemented"); + LOG.severe(ex, ex.getMessage()); + throw ex; } @Override public boolean isWrapperFor(Class iface) throws SQLException { - throw new BigQueryJdbcSqlFeatureNotSupportedException("isWrapperFor is not implemented"); + BigQueryJdbcSqlFeatureNotSupportedException ex = + new BigQueryJdbcSqlFeatureNotSupportedException("isWrapperFor is not implemented"); + LOG.severe(ex, ex.getMessage()); + throw ex; } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java index ac2ee99fdb53..345087b3f526 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryStatement.java @@ -241,13 +241,16 @@ public ResultSet executeQuery(String sql) throws SQLException { setDestinationDatasetAndTableInJobConfig(getJobConfig(sql).build()); runQuery(sql, jobConfiguration); } catch (InterruptedException ex) { - LOG.severe(ex, "Interrupted during executeQuery"); - throw new BigQueryJdbcException(ex); + BigQueryJdbcException e = new BigQueryJdbcException("Interrupted during executeQuery", ex); + LOG.severe(e, e.getMessage()); + throw e; } if (!isSingularResultSet()) { - throw new BigQueryJdbcException( - "Query returned more than one or didn't return any ResultSet."); + BigQueryJdbcException ex = + new BigQueryJdbcException("Query returned more than one or didn't return any ResultSet."); + LOG.severe(ex, ex.getMessage()); + throw ex; } // This contains all the other assertions spec required on this method return getCurrentResultSet(); @@ -261,12 +264,17 @@ public long executeLargeUpdate(String sql) throws SQLException { QueryJobConfiguration.Builder jobConfiguration = getJobConfig(sql); runQuery(sql, jobConfiguration.build()); } catch (InterruptedException ex) { - LOG.severe(ex, "Interrupted during executeLargeUpdate"); - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = + new BigQueryJdbcRuntimeException("Interrupted during executeLargeUpdate", ex); + LOG.severe(e, e.getMessage()); + throw e; } if (this.currentUpdateCount == -1) { - throw new BigQueryJdbcException( - "Update query expected to return affected row count. Double check query type."); + BigQueryJdbcException ex = + new BigQueryJdbcException( + "Update query expected to return affected row count. Double check query type."); + LOG.severe(ex, ex.getMessage()); + throw ex; } return this.currentUpdateCount; } @@ -299,7 +307,10 @@ public boolean execute(String sql) throws SQLException { } runQuery(sql, jobConfiguration); } catch (InterruptedException ex) { - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = + new BigQueryJdbcRuntimeException("Interrupted during execute", ex); + LOG.severe(e, e.getMessage()); + throw e; } return getCurrentResultSet() != null; } @@ -313,9 +324,16 @@ StatementType getStatementType(QueryJobConfiguration queryJobConfiguration) thro job = bigQuery.create(JobInfo.of(dryRunJobConfiguration)); } catch (BigQueryException ex) { if (ex.getMessage().contains("Syntax error")) { - throw new BigQueryJdbcSqlSyntaxErrorException(ex); + BigQueryJdbcSqlSyntaxErrorException e = + new BigQueryJdbcSqlSyntaxErrorException( + "BigQueryException during getStatementType", ex); + LOG.severe(e, e.getMessage()); + throw e; } - throw new BigQueryJdbcException(ex); + BigQueryJdbcException e = + new BigQueryJdbcException("BigQueryException during getStatementType", ex); + LOG.severe(e, e.getMessage()); + throw e; } QueryStatistics statistics = job.getStatistics(); return statistics.getStatementType(); @@ -346,9 +364,16 @@ QueryStatistics getQueryStatistics(QueryJobConfiguration queryJobConfiguration) return job.getStatistics(); } catch (BigQueryException ex) { if (ex.getMessage().contains("Syntax error")) { - throw new BigQueryJdbcSqlSyntaxErrorException(ex); + BigQueryJdbcSqlSyntaxErrorException e = + new BigQueryJdbcSqlSyntaxErrorException( + "BigQueryException during getQueryStatistics", ex); + LOG.severe(e, e.getMessage()); + throw e; } - throw new BigQueryJdbcException(ex); + BigQueryJdbcException e = + new BigQueryJdbcException("BigQueryException during getQueryStatistics", ex); + LOG.severe(e, e.getMessage()); + throw e; } } @@ -416,7 +441,9 @@ public int getQueryTimeout() { @Override public void setQueryTimeout(int seconds) { if (seconds < 0) { - throw new IllegalArgumentException("Query Timeout should be >= 0."); + IllegalArgumentException ex = new IllegalArgumentException("Query Timeout should be >= 0."); + LOG.severe(ex, ex.getMessage()); + throw ex; } this.queryTimeout = seconds; } @@ -442,7 +469,9 @@ public void cancel() throws SQLException { || e.getMessage().contains("Error: 3848323"))) { LOG.warning("Attempted to cancel a job that was already done: " + jobId); } else { - throw new BigQueryJdbcException(e); + BigQueryJdbcException ex = new BigQueryJdbcException("Failed to cancel job", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } } } @@ -550,7 +579,10 @@ ExecuteResult executeJob(QueryJobConfiguration jobConfiguration) if (result instanceof Job) { job = (Job) result; } else { - throw new BigQueryJdbcException("Unexpected result type from queryWithTimeout"); + BigQueryJdbcException ex = + new BigQueryJdbcException("Unexpected result type from queryWithTimeout"); + LOG.severe(ex, ex.getMessage()); + throw ex; } } else { // Update jobId with custom JobId if jobless query is disabled. @@ -560,12 +592,16 @@ ExecuteResult executeJob(QueryJobConfiguration jobConfiguration) } if (job == null) { - throw new BigQueryJdbcException("Failed to create BQ Job."); + BigQueryJdbcException ex = new BigQueryJdbcException("Failed to create BQ Job."); + LOG.severe(ex, ex.getMessage()); + throw ex; } synchronized (cancelLock) { if (isCanceled) { job.cancel(); - throw new BigQueryJdbcException("Query was cancelled."); + BigQueryJdbcException ex = new BigQueryJdbcException("Query was cancelled."); + LOG.severe(ex, ex.getMessage()); + throw ex; } jobId = job.getJobId(); jobIds.add(jobId); @@ -604,12 +640,20 @@ void runQuery(String query, QueryJobConfiguration jobConfiguration) SqlType queryType = getQueryType(jobConfiguration, statementType); handleQueryResult(query, executeResult.tableResult, queryType); } catch (InterruptedException ex) { - throw new BigQueryJdbcRuntimeException(ex); + BigQueryJdbcRuntimeException e = + new BigQueryJdbcRuntimeException("Interrupted during runQuery", ex); + LOG.severe(e, e.getMessage()); + throw e; } catch (BigQueryException ex) { if (ex.getMessage().contains("Syntax error")) { - throw new BigQueryJdbcSqlSyntaxErrorException(ex); + BigQueryJdbcSqlSyntaxErrorException e = + new BigQueryJdbcSqlSyntaxErrorException("BigQueryException during runQuery", ex); + LOG.severe(e, e.getMessage()); + throw e; } - throw new BigQueryJdbcException(ex); + BigQueryJdbcException e = new BigQueryJdbcException("BigQueryException during runQuery", ex); + LOG.severe(e, e.getMessage()); + throw e; } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercer.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercer.java index 42640ddf285b..66e408f0596e 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercer.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercer.java @@ -113,12 +113,17 @@ T coerceTo(Class targetClass, Object value) { if (targetClass.equals(String.class)) { return (T) value.toString(); } - throw new BigQueryJdbcCoercionNotFoundException(sourceClass, targetClass); + BigQueryJdbcCoercionNotFoundException ex = + new BigQueryJdbcCoercionNotFoundException(sourceClass, targetClass); + LOG.severe(ex, ex.getMessage()); + throw ex; } try { return coercion.coerce(sourceClass != Void.class ? value : null); } catch (Exception ex) { - throw new BigQueryJdbcCoercionException(ex); + BigQueryJdbcCoercionException e = new BigQueryJdbcCoercionException(ex); + LOG.severe(e, "Coercion failed"); + throw e; } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercionUtility.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercionUtility.java index 9a4dc21304e4..faf1d1e40658 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercionUtility.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryTypeCoercionUtility.java @@ -39,6 +39,8 @@ @InternalApi class BigQueryTypeCoercionUtility { + private static final BigQueryJdbcCustomLogger LOG = + new BigQueryJdbcCustomLogger(BigQueryTypeCoercionUtility.class.getName()); static BigQueryTypeCoercer INSTANCE; @@ -256,8 +258,11 @@ public Time coerce(FieldValue fieldValue) { long millis = TimeUnit.NANOSECONDS.toMillis(localTime.toNanoOfDay()); return new Time(millis); } catch (java.time.format.DateTimeParseException e) { - throw new IllegalArgumentException( - "Cannot parse the value " + strTime + " to java.sql.Time", e); + IllegalArgumentException ex = + new IllegalArgumentException( + "Cannot parse the value " + strTime + " to java.sql.Time", e); + LOG.severe(ex, ex.getMessage()); + throw ex; } } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 471c38767501..844ea10adc5a 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -973,11 +973,14 @@ public Boolean getUseStatelessQueryMode() { public void setJobCreationMode(Integer jobCreationMode) { if (jobCreationMode != null && !VALID_JOB_CREATION_MODES.contains(jobCreationMode)) { - throw new IllegalArgumentException( - String.format( - "Invalid value for %s. Use 1 for JOB_CREATION_REQUIRED and 2 for" - + " JOB_CREATION_OPTIONAL.", - BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME)); + IllegalArgumentException ex = + new IllegalArgumentException( + String.format( + "Invalid value for %s. Use 1 for JOB_CREATION_REQUIRED and 2 for" + + " JOB_CREATION_OPTIONAL.", + BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME)); + LOG.severe(ex, ex.getMessage()); + throw ex; } this.jobCreationMode = jobCreationMode; } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java index 66a957a06f84..3b03af3ef50c 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionDataSource.java @@ -24,6 +24,8 @@ import javax.sql.PooledConnection; public class PooledConnectionDataSource extends DataSource implements ConnectionPoolDataSource { + private static final BigQueryJdbcCustomLogger LOG = + new BigQueryJdbcCustomLogger(PooledConnectionDataSource.class.getName()); private PooledConnectionListener connectionPoolManager = null; Connection bqConnection = null; @@ -37,8 +39,11 @@ public PooledConnection getPooledConnection() throws SQLException { bqConnection = super.getConnection(); } if (bqConnection == null) { - throw new BigQueryJdbcRuntimeException( - "Cannot get pooled connection: unable to get underlying physical connection"); + BigQueryJdbcRuntimeException ex = + new BigQueryJdbcRuntimeException( + "Cannot get pooled connection: unable to get underlying physical connection"); + LOG.severe(ex, ex.getMessage()); + throw ex; } Long connectionPoolSize = ((BigQueryConnection) bqConnection).getConnectionPoolSize(); if (connectionPoolManager == null) { @@ -62,6 +67,9 @@ public PooledConnectionListener getConnectionPoolManager() { @Override public PooledConnection getPooledConnection(String arg0, String arg1) throws SQLException { - throw new UnsupportedOperationException("This operation is not supported by the driver"); + UnsupportedOperationException ex = + new UnsupportedOperationException("This operation is not supported by the driver"); + LOG.severe(ex, ex.getMessage()); + throw ex; } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionListener.java b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionListener.java index 9f3b210443e0..b3edb61e3973 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionListener.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/PooledConnectionListener.java @@ -92,9 +92,12 @@ public void connectionClosed(ConnectionEvent event) { if (eventSource == null || !(eventSource instanceof BigQueryPooledConnection) || !(eventSource.getClass().isAssignableFrom(BigQueryPooledConnection.class))) { - throw new IllegalArgumentException( - "Invalid ConnectionEvent source passed to connectionClosed. Expecting" - + " BigQueryPooledConnection."); + IllegalArgumentException ex = + new IllegalArgumentException( + "Invalid ConnectionEvent source passed to connectionClosed. Expecting" + + " BigQueryPooledConnection."); + LOG.severe(ex, ex.getMessage()); + throw ex; } BigQueryPooledConnection bqPooledConnection = (BigQueryPooledConnection) eventSource; addConnection(bqPooledConnection); @@ -108,9 +111,12 @@ public void connectionErrorOccurred(ConnectionEvent event) { if (eventSource == null || !(eventSource instanceof BigQueryPooledConnection) || !(eventSource.getClass().isAssignableFrom(BigQueryPooledConnection.class))) { - throw new IllegalArgumentException( - "Invalid ConnectionEvent source passed to connectionClosed. Expecting" - + " BigQueryPooledConnection."); + IllegalArgumentException ex = + new IllegalArgumentException( + "Invalid ConnectionEvent source passed to connectionClosed. Expecting" + + " BigQueryPooledConnection."); + LOG.severe(ex, ex.getMessage()); + throw ex; } BigQueryPooledConnection bqPooledConnection = (BigQueryPooledConnection) eventSource; removeConnection(bqPooledConnection); diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java index 3630f86133dc..9176bb83d7be 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcOAuthUtilityTest.java @@ -111,7 +111,7 @@ public void testInvalidTokenUriForAuthType0() { BigQueryJdbcOAuthUtility.getCredentials(oauthProperties, overrideProperties, false, null); Assertions.fail(); } catch (BigQueryJdbcRuntimeException e) { - assertThat(e.getMessage()).contains("java.net.URISyntaxException"); + assertThat(e.getMessage()).contains("Validation failure"); } } diff --git a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java index 316444aebb75..bc6f74f304f7 100644 --- a/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java +++ b/java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/it/ITBigQueryJDBCTest.java @@ -309,7 +309,7 @@ public void testInvalidQuery() throws SQLException { bigQueryStatement.executeQuery(query); Assertions.fail(); } catch (BigQueryJdbcException e) { - assertTrue(e.getMessage().contains("SELECT * must have a FROM clause")); + assertTrue(e.getCause().getMessage().contains("SELECT * must have a FROM clause")); } }