Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,18 @@ SELECT
REGEXP_EXTRACT(fk.constraint_name, r'[^.]+$') AS FK_NAME,
REGEXP_EXTRACT(pk.constraint_name, r'[^.]+$') AS PK_NAME,
7 AS DEFERRABILITY
FROM `%1$s.%2$s.INFORMATION_SCHEMA.KEY_COLUMN_USAGE` AS pk
JOIN `%1$s.%2$s.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE` AS ccu
FROM `%1$s`.`%2$s`.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS pk
JOIN `%1$s`.`%2$s`.INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu
ON ccu.table_catalog = pk.table_catalog
AND ccu.table_schema = pk.table_schema
AND ccu.table_name = pk.table_name
AND ccu.column_name = pk.column_name
JOIN `%1$s.%2$s.INFORMATION_SCHEMA.KEY_COLUMN_USAGE` AS fk
JOIN `%1$s`.`%2$s`.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS fk
ON fk.constraint_catalog = ccu.constraint_catalog
AND fk.constraint_schema = ccu.constraint_schema
AND fk.constraint_name = ccu.constraint_name
AND fk.position_in_unique_constraint = pk.ordinal_position
JOIN `%1$s.%2$s.INFORMATION_SCHEMA.TABLE_CONSTRAINTS` AS tc
JOIN `%1$s`.`%2$s`.INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
ON tc.constraint_catalog = fk.constraint_catalog
AND tc.constraint_schema = fk.constraint_schema
AND tc.constraint_name = fk.constraint_name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import com.google.cloud.bigquery.jdbc.BigQueryConnection;
import java.sql.Connection;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actually this file is not used, I need to remove it after validating that there are no unique tests.

We're running regular set of tests in TPC. We should have regular metadata test validating this scenario

import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
Expand All @@ -38,11 +39,11 @@ public class ITTPCBigQueryTest {
private static final String TPC_PROJECT_ID = System.getenv("PROJECT_ID");

private static final String TPC_ENDPOINT =
(ENDPOINT_URL.isEmpty())
(ENDPOINT_URL == null || ENDPOINT_URL.isEmpty())
? "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443"
: "jdbc:bigquery://" + ENDPOINT_URL;
private static final String TPC_UNIVERSE_DOMAIN =
(UNIVERSE_DOMAIN.isEmpty()) ? "googleapis.com" : UNIVERSE_DOMAIN;
(UNIVERSE_DOMAIN == null || UNIVERSE_DOMAIN.isEmpty()) ? "googleapis.com" : UNIVERSE_DOMAIN;

// See here go/bq-cli-tpc for testing setup.
// Use the default test project.
Expand All @@ -69,17 +70,18 @@ public void testServiceAccountAuthenticationViaEmail() throws SQLException {
+ TPC_PVT_KEY
+ ";";

Connection connection = DriverManager.getConnection(connection_uri);
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"GOOGLE_SERVICE_ACCOUNT",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT 1";
Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query);
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
connection.close();
try (Connection connection = DriverManager.getConnection(connection_uri)) {
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"GOOGLE_SERVICE_ACCOUNT",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT 1";
try (Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query)) {
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
}
}
}

// You will need to change the environment variable for GOOGLE_APPLICATION_CREDENTIALS to point to
Expand All @@ -98,17 +100,18 @@ public void testValidApplicationDefaultCredentialsAuthentication() throws SQLExc
+ TPC_UNIVERSE_DOMAIN
+ ";";

Connection connection = DriverManager.getConnection(connection_uri);
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"APPLICATION_DEFAULT_CREDENTIALS",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT * FROM test.test;";
Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query);
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
connection.close();
try (Connection connection = DriverManager.getConnection(connection_uri)) {
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"APPLICATION_DEFAULT_CREDENTIALS",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT * FROM test.test;";
try (Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query)) {
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
}
}
}

@Test
Expand All @@ -128,14 +131,15 @@ public void testValidPreGeneratedAccessTokenAuthentication() throws SQLException
+ TPC_UNIVERSE_DOMAIN
+ ";";

Connection connection = DriverManager.getConnection(connection_uri);
String query = "SELECT * FROM test.test;";
Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query);
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
assertNotNull(connection);
assertFalse(connection.isClosed());
connection.close();
try (Connection connection = DriverManager.getConnection(connection_uri)) {
assertNotNull(connection);
assertFalse(connection.isClosed());
String query = "SELECT * FROM test.test;";
try (Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query)) {
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
}
}
}

@Test
Expand All @@ -158,17 +162,18 @@ public void testSimpleQueryReturns() throws SQLException {
+ TPC_PVT_KEY
+ ";"; // Plug in this value when testing from the key file

Connection connection = DriverManager.getConnection(connection_uri);
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"GOOGLE_SERVICE_ACCOUNT",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT * FROM test.test;";
Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query);
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
connection.close();
try (Connection connection = DriverManager.getConnection(connection_uri)) {
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"GOOGLE_SERVICE_ACCOUNT",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT * FROM test.test;";
try (Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query)) {
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
}
}
}

@Test
Expand All @@ -187,33 +192,128 @@ public void testServiceAccountKeyFileReturns() throws SQLException {
// Point the key path to where you have downloaded it to.
+ "OAuthPvtKeyPath=/Users/YourPathToSecretFile/SAKeyFile.json;";

Connection connection = DriverManager.getConnection(connection_uri);
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"GOOGLE_SERVICE_ACCOUNT",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT * FROM test.test;";
Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query);
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
connection.close();
try (Connection connection = DriverManager.getConnection(connection_uri)) {
assertNotNull(connection);
assertFalse(connection.isClosed());
assertEquals(
"GOOGLE_SERVICE_ACCOUNT",
connection.unwrap(BigQueryConnection.class).getAuthProperties().get("OAuthType"));
String query = "SELECT * FROM test.test;";
try (Statement statement = connection.createStatement();
ResultSet jsonResultSet = statement.executeQuery(query)) {
assertTrue(jsonResultSet.getClass().getName().contains("BigQueryJsonResultSet"));
}
}
}

@Test
public void testDatabaseMetadataOperationsInTPC() throws SQLException {
validateTPCEnvironment();
String connection_uri =
TPC_ENDPOINT
+ ";"
+ "ProjectId="
+ TPC_PROJECT_ID
+ ";"
+ "OAuthType=0;"
+ "universeDomain="
+ TPC_UNIVERSE_DOMAIN
+ ";"
+ "OAuthServiceAcctEmail="
+ TPC_SERVICE_ACCOUNT
+ ";"
+ "OAuthPvtKey="
+ TPC_PVT_KEY
+ ";";

String dataset = "INTEGRATION_TESTS";
String pkTable = "IT_METADATA_PK_" + System.currentTimeMillis();
String fkTable = "IT_METADATA_FK_" + System.currentTimeMillis();

try (Connection connection = DriverManager.getConnection(connection_uri);
Statement stmt = connection.createStatement()) {
assertNotNull(connection);
assertFalse(connection.isClosed());

try {
// Create test PK and FK tables
stmt.execute(
String.format(
"CREATE OR REPLACE TABLE `%s.%s.%s` (id INT64, name STRING, PRIMARY KEY (id) NOT ENFORCED);",
TPC_PROJECT_ID, dataset, pkTable));
stmt.execute(
String.format(
"CREATE OR REPLACE TABLE `%s.%s.%s` (order_id INT64, pk_id INT64, PRIMARY KEY (order_id) NOT ENFORCED, CONSTRAINT fk_order FOREIGN KEY (pk_id) REFERENCES `%s.%s.%s`(id) NOT ENFORCED);",
TPC_PROJECT_ID, dataset, fkTable, TPC_PROJECT_ID, dataset, pkTable));

DatabaseMetaData metaData = connection.getMetaData();
assertNotNull(metaData);

// 1. Test getTables
try (ResultSet rs = metaData.getTables(TPC_PROJECT_ID, dataset, pkTable, null)) {
assertTrue(rs.next(), "Expected PK table to be returned by getTables");
assertEquals(pkTable, rs.getString("TABLE_NAME"));
assertFalse(rs.next());
}

// 2. Test getColumns
try (ResultSet rs = metaData.getColumns(TPC_PROJECT_ID, dataset, pkTable, "id")) {
assertTrue(rs.next(), "Expected id column to be returned by getColumns");
assertEquals("id", rs.getString("COLUMN_NAME"));
assertFalse(rs.next());
}

// 3. Test getPrimaryKeys
try (ResultSet rs = metaData.getPrimaryKeys(TPC_PROJECT_ID, dataset, pkTable)) {
assertTrue(rs.next(), "Expected primary key to be returned by getPrimaryKeys");
assertEquals("id", rs.getString("COLUMN_NAME"));
assertFalse(rs.next());
}

// 4. Test getImportedKeys
try (ResultSet rs = metaData.getImportedKeys(TPC_PROJECT_ID, dataset, fkTable)) {
assertTrue(rs.next(), "Expected foreign key to be returned by getImportedKeys");
assertEquals(pkTable, rs.getString("PKTABLE_NAME"));
assertEquals("id", rs.getString("PKCOLUMN_NAME"));
assertEquals(fkTable, rs.getString("FKTABLE_NAME"));
assertEquals("pk_id", rs.getString("FKCOLUMN_NAME"));
assertEquals("fk_order", rs.getString("FK_NAME"));
assertFalse(rs.next());
}

// 5. Test getExportedKeys
try (ResultSet rs = metaData.getExportedKeys(TPC_PROJECT_ID, dataset, pkTable)) {
assertTrue(rs.next(), "Expected exported foreign key to be returned by getExportedKeys");
assertEquals(pkTable, rs.getString("PKTABLE_NAME"));
assertEquals("id", rs.getString("PKCOLUMN_NAME"));
assertEquals(fkTable, rs.getString("FKTABLE_NAME"));
assertEquals("pk_id", rs.getString("FKCOLUMN_NAME"));
assertEquals("fk_order", rs.getString("FK_NAME"));
assertFalse(rs.next());
}
} finally {
stmt.execute(
String.format("DROP TABLE IF EXISTS `%s.%s.%s`;", TPC_PROJECT_ID, dataset, fkTable));
stmt.execute(
String.format("DROP TABLE IF EXISTS `%s.%s.%s`;", TPC_PROJECT_ID, dataset, pkTable));
}
}
}

private void validateTPCEnvironment() {
if (TPC_PROJECT_ID.isEmpty()) {
if (TPC_PROJECT_ID == null || TPC_PROJECT_ID.isEmpty()) {
throw new IllegalArgumentException("TPC_PROJECT_ID is empty");
}
if (TPC_SERVICE_ACCOUNT.isEmpty()) {
if (TPC_SERVICE_ACCOUNT == null || TPC_SERVICE_ACCOUNT.isEmpty()) {
throw new IllegalArgumentException("TPC_SERVICE_ACCOUNT is empty");
}
if (TPC_ENDPOINT.isEmpty()) {
if (TPC_ENDPOINT == null || TPC_ENDPOINT.isEmpty()) {
throw new IllegalArgumentException("TPC_ENDPOINT is empty");
}
if (TPC_PVT_KEY.isEmpty()) {
if (TPC_PVT_KEY == null || TPC_PVT_KEY.isEmpty()) {
throw new IllegalArgumentException("TPC_PVT_KEY is empty");
}
if (TPC_UNIVERSE_DOMAIN.isEmpty()) {
if (TPC_UNIVERSE_DOMAIN == null || TPC_UNIVERSE_DOMAIN.isEmpty()) {
throw new IllegalArgumentException("TPC_UNIVERSE_DOMAIN is empty");
}
}
Expand Down
Loading